此示例显示如何使用要点自动检测和跟踪脸部。即使当人倾斜他或她的头部或朝向或远离相机,也可以跟踪面部的轨道。
目标检测和跟踪在许多计算机视觉应用中都很重要,包括活动识别、汽车安全和监视。在本例中,您将开发一个简单的面部跟踪系统,将跟踪问题分为三个部分:
发现一张脸
识别面部特征以跟踪
跟踪的脸
首先,你必须检测到脸部。使用愿景。CascadeObjectDetector
对象,用于检测视频帧中人脸的位置。级联对象检测器使用Viola-Jones检测算法和训练过的分类模型进行检测。默认情况下,检测器被配置为检测人脸,但它可以用于检测其他类型的对象。
%创建级联检测器对象。faceDetector = vision.CascadeObjectDetector ();%读取视频帧并运行人脸检测器。VideoReader = Videoreader(“tilted_face.avi”);视频rame = ReadFrame(Videoreader);bbox =步骤(FaceDetector,Videoframe);%在检测到的面周围绘制返回的边界框。视频rame = insertshape(视频rame,“矩形”, bbox);图;imshow (videoFrame);标题(“发现脸”);
%将第一个框转换为4个点的列表%这是需要能够可视化的旋转对象。bboxPoints = bbox2points(bbox(1,:)));
要随着时间的推移跟踪面部,此示例使用Kanade-Lucas-Tomasi(KLT)算法。虽然可以在每个帧上使用级联对象检测器,但它是计算昂贵的。当受试者转向或倾斜他的头时,它也可能无法检测到面部。这种限制来自用于检测的训练分类模型的类型。的例子检测面部只有一次,然后将KLT算法跟踪各视频帧的面部。
KLT算法跟踪视频帧上的一组特征点。一旦检测找到面部,示例中的下一步骤识别可以可靠地跟踪的特征点。此示例使用Shi和Tomasi提出的标准,“跟踪良好功能”。
检测人脸区域的特征点。
点= detectMinEigenFeatures (rgb2gray (videoFrame),'roi', bbox);%显示检测到的点。人物,imshow (videoFrame)在, 标题('检测到的功能');情节(点);
确定特征点后,您现在可以使用愿景。PointTracker
系统对象跟踪它们。对于前一帧中的每个点,点跟踪器试图在当前帧中找到相应的点。然后是estimateGeometricTransform2D
函数用于估计旧点和新点之间的转换,旋转和比例。该变换应用于面部周围的边界框。
创建一个点跟踪器,并启用双向误差约束,使其在噪声和杂波存在时更健壮。
pointtracker = Vision.PointCracker(“MaxBidirectionalError”,2);用初始点位置和初始值初始化跟踪器%的视频帧。点= points.Location;初始化(pointTracker点,videoFrame);
创建一个用于显示视频帧的视频播放器对象。
放像机=愿景。放像机(“位置”那......[100 100 [大小(视频帧,2),大小(视频帧,1)] + 30);
跟踪帧到帧的点,并使用estimateGeometricTransform2D
函数来估计脸部的运动。
复制点,用于计算前一帧和当前帧之间的几何变换
oldPoints =点;而Hasfame(录像机)获得下一帧视频rame = ReadFrame(Videoreader);%追踪积分。注意,有些分数可能会丢失。[点,isfound] =步骤(PointTracker,Videoframe);visiblepoints = points(isfound,:);oderinliers = oldPoints(isfound,:);如果>= 1%需要至少2分估计旧点之间的几何变换%和新点和消除异常值[XForm,InLieridX] = eStimateGeometricTransform2D(......oldInliers visiblePoints,“相似”那'maxdistance'4);oldInliers = oldInliers(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);结尾%清理释放(放像机);
释放(PointTracker);
在本例中,您创建了一个简单的人脸跟踪系统,它可以自动检测和跟踪单个人脸。尝试改变输入视频,看看你是否仍然能够检测和跟踪人脸。在检测步骤的初始帧中,确保这个人面对着摄像机。
Viola,Paul A.和Jones,Michael J.“使用促进级联的简单功能的快速对象检测”,IEEE CVPR,2001。
Bruce D. Lucas和Takeo Kanade。一种迭代图像配准技术,其应用于立体视觉。1981年人工智能国际联合会议。
卡洛·托马西和金ade武夫。点特征检测与跟踪。卡耐基梅隆大学技术报告
建立施和卡洛托马斯。追踪的良好功能。电脑愿景和模式识别的IEEE会议,1994年。
Zdenek Kalal,Krystian Mikolajczyk和Jiri Matas。前后错误:自动检测跟踪故障。2010年模式识别国际会议