此示例显示如何使用要素点自动检测和跟踪面部。这种例子中的方法即使当人倾斜他或她的头部或朝向或远离相机也会跟踪面部。
对象检测和跟踪在许多计算机视觉应用中非常重要,包括活动识别,汽车安全和监视。在此示例中,您将通过将跟踪问题划分为三个部分来开发一个简单的面部跟踪系统:
探测面部
识别要追踪的面部特征
追踪面部
首先,你必须检测到脸部。使用Vision.cascadeObjectDetector.
对象以检测视频帧中的面部的位置。级联对象检测器使用Viola-Jones检测算法和训练的分类模型进行检测。默认情况下,探测器配置为检测面,但它可用于检测其他类型的对象。
%创建级联检测器对象。FaceDetector = Vision.cascadeObjectDetector();%读取视频帧并运行面部检测器。Videoreader = Videoreader('tilted_face.avi');视频rame = ReadFrame(Videoreader);bbox =步骤(FaceDetector,Videoframe);%在检测到的面周围绘制返回的边界框。视频rame = insertshape(视频rame,'长方形',bbox);数字;imshow(视频rame);标题('被发现的脸');
%将第一个框转换为4个点的列表百分比可以能够可视化对象的旋转。bboxpoints = bbox2points(bbox(1,:));
要跟踪面部随着时间的推移,此示例使用Kanade-Lucas-Tomasi(KLT)算法。虽然可以在每个帧上使用级联对象检测器,但它是计算昂贵的。当受试者转向或倾斜他的头时,它也可能无法检测到面部。这种限制来自用于检测的训练分类模型的类型。该示例仅检测一次面部,然后KLT算法在视频帧上跟踪面部。
KLT算法在视频帧上跟踪一组特征点。一旦检测找到面部,示例中的下一步骤标识可以可靠地跟踪的特征点。此示例使用SHI和Tomasi提出的标准,“良好的追踪”。
检测面部区域中的特征点。
点=侦听(RGB2GRAY(Videoframe),'roi',bbox);%显示检测到的点。图,imshow(视频rame),持有在, 标题(“检测到的功能”);情节(点);
通过识别的功能点,您现在可以使用Vision.PointCracker.
系统对象跟踪它们。对于前一帧中的每个点,点跟踪器试图在当前帧中找到相应的点。然后是estimationGeometricTransform2d.
函数用于估计旧点和新点之间的转换,旋转和比例。该变换应用于面部周围的边界框。
创建一个点跟踪器并启用双向误差约束,使其在存在噪声和杂乱的情况下使其更加强大。
pointtracker = Vision.PointTracker('maxbidirectionalerror',2);%用初始点位置和初始初始化跟踪器%视频帧。点= points.location;初始化(PointTracker,Points,Videoframe);
创建一个用于显示视频帧的视频播放器对象。
VideoPlayer = Vision.videoplayer('位置'那......[100 100 [大小(视频帧,2),大小(视频帧,1)] + 30);
跟踪帧到帧的点,并使用estimationGeometricTransform2d.
估计面部运动的功能。
制作要用于计算前一个和当前帧中点之间的几何变换的点副本
OldPoints =积分;尽管Hasfame(Videoreader)%得到下一帧视频rame = ReadFrame(Videoreader);%跟踪点。请注意,某些点可能会丢失。[点,isfound] =步骤(PointTracker,Videoframe);visiblepoints = points(isfound,:);ollinliers = oldPoints(isfound,:);如果尺寸(可见点,1)> = 2%需要至少2分%估计旧点之间的几何变换%和新点和消除异常值[XForm,InLieridx] = eStimateGeometricTransform2D(......旧单,读物点,'相似'那'maxdistance',4);ollinliers = ollinliers(Inlieridx,:);VisiblePoints = VisiblePoints(Inlieridx,:);%将转换应用于边界框点bboxpoints = TransformPointSforward(XForm,BboxPoints);%在被跟踪的对象周围插入边界框BboxPolygon = Rehape(BboxPoints',1,[]);视频rame = insertshape(视频rame,'多边形',bboxpolygon,......'行宽',2);%显示跟踪点视频rame = InsertMarker(视频帧,visiblepoints,'+'那......'颜色'那'白色的');%重置点OldPoints = VisiblePoints;设定值(PointTracker,OldPoints);结尾%使用Video Player对象显示带注释的视频帧步骤(VideoPlayer,Videoframe);结尾% 清理释放(Videoplayer);
发布(PointTracker);
在此示例中,您创建了一个简单的面部跟踪系统,可自动检测并跟踪单个脸部。尝试更改输入视频,并查看您是否仍然能够检测和跟踪脸部。确保该人在初始帧中面向检测步骤的相机。
Viola,Paul A.和Jones,Michael J.“使用促进级联的简单功能的快速对象检测”,IEEE CVPR,2001。
Bruce D. Lucas和Takeo Kanade。一种迭代图像配准技术,其应用于立体视觉。1981年人工智能国际联合会议。
Carlo Tomasi和Takeo Kanade。点特征的检测和跟踪。卡内基梅隆大学技术报告CMU-CS-91-132,1991。
建立施和卡洛托马斯。跟踪的良好功能。IEEE计算机愿景和模式识别,1994年。
Zdenek Kalal,Krystian Mikolajczyk和Jiri Matas。前后误差:自动检测跟踪故障。2010年模式识别国际会议