主要内容

基于KLT算法的人脸检测与跟踪

这个例子展示了如何使用特征点自动检测和跟踪一个人脸。在这个例子中,即使当人倾斜他或她的头,或移动到或远离相机的时候,方法仍然保持对脸的跟踪。

介绍

对象检测和跟踪在许多计算机视觉应用中非常重要,包括活动识别,汽车安全和监视。在此示例中,您将通过将跟踪问题分为三个部分来开发一个简单的面部跟踪系统:

  1. 检测面部

  2. 识别跟踪的面部特征

  3. 跟踪的脸

检测面部

首先,你必须检测脸部。使用Vision.cascadeObjectDetector对象以检测视频帧中的面部的位置。级联物体检测器使用Viola-Jones检测算法和培训的分类模型进行检测。默认情况下,检测器配置为检测面,但它可用于检测其他类型的对象。

创建一个级联检测器对象。FaceDetector = Vision.cascadeObjectDetector();%读取视频帧并运行面部检测器。videoReader = videoReader ('tilted_face.avi');videoFrame = readFrame (videoReader);bbox = step(faceDetector, videofframe);%在检测到的面周围绘制返回的边界框。videoFrame = insertShape (videoFrame,'长方形',bbox);数字;imshow(视频rame);标题('检测到脸');

图中包含一个轴。带有“已检测面”标题的轴包含类型图像的对象。

%将第一个框转换为4个点的列表百分比可以能够可视化对象的旋转。bboxPoints = bbox2points(bbox(1,:));

为了随着时间的推移追踪人脸,这个例子使用了Kanade-Lucas-Tomasi (KLT)算法。虽然可以在每一帧上使用级联对象检测器,但它的计算成本很高。当被测者转动或倾斜头部时,它也可能无法检测到面部。这种限制来自于用于检测的训练分类模型的类型。该示例只检测一次人脸,然后KLT算法通过视频帧跟踪人脸。

识别面部特征跟踪

KLT算法在视频帧中跟踪一组特征点。一旦检测定位了人脸,示例中的下一步就是识别出可以可靠跟踪的特征点。这个例子使用了Shi和Tomasi提出的标准“要跟踪的好特性”。

检测面部区域中的特征点。

点=侦听(RGB2GRAY(Videoframe),“投资回报”,bbox);%显示检测到的点。图,imshow(视频rame),持有、标题(检测功能的);情节(点);

图中包含一个轴。带标题特征的轴包含类型图像、线两个对象。

初始化一个跟踪器来跟踪点

使用所识别的功能点,您现在可以使用Vision.PointCracker.系统对象来跟踪它们。对于前一帧中的每个点,点跟踪器试图在当前帧中找到相应的点。然后estimateGeometricTransform2d.函数用于估计旧点和新点之间的平移、旋转和比例。这个变换应用于面周围的边界框。

创建一个点跟踪器并启用双向误差约束,使其在存在噪声和杂波中的存在更加稳健。

pointTracker =愿景。PointTracker ('maxbidirectionalerror'2);%用初始点位置和初始初始化跟踪器%视频帧。点= points.location;初始化(PointTracker,点,视频帧);

初始化视频播放器以显示结果

创建一个用于显示视频帧的视频播放器对象。

VideoPlayer = Vision.videoplayer('位置'...[100 100 [size(videofframe, 2), size(videofframe, 1)]+30]);

跟踪的脸

跟踪点从一帧到另一帧,并使用estimateGeometricTransform2d.估计面部运动的功能。

制作要用于计算上一个和当前帧之间的点之间的几何变换的点副本

OldPoints =积分;尽管hasFrame (videoReader)%得到下一帧videoFrame = readFrame (videoReader);%跟踪点。请注意,某些点可能会丢失。[points, isFound] = step(pointTracker, videofframe);visiblePoints = points(isFound,:);oldInliers = oldPoints(isFound,:);如果尺寸(可见点,1)> = 2%需要至少2分%估计旧点之间的几何变换%和新的点,并消除异常值[xform, inlierIdx] = estimategeometritransform2d (...旧单,观光点,'相似'“MaxDistance”4);oderinliers = ollinliers(Inlieridx,:);VisiblePoints = VisiblePoints(Inlieridx,:);%应用转换到边界框点bboxPoints = transformPointsForward(xform, bboxPoints);%在被跟踪对象周围插入一个边界框bboxPolygon =重塑(bboxPoints', 1, []);videoFrame = insertShape (videoFrame,“多边形”,bboxpolygon,...'行宽'2);%显示跟踪点videframe = insertMarker(videframe, visiblePoints,可视点)'+'...'颜色'“白色”);%重置点数OldPoints = VisiblePoints;设定值(PointTracker,OldPoints);结束%使用视频播放器对象显示带注释的视频帧步骤(放像机、videoFrame);结束% 清理释放(Videoplayer);

图象视频播放器包含UiflowContainer,Uimenu,UIToolbar类型的轴和其他对象。轴包含类型图像的对象。

释放(pointTracker);

概括

在此示例中,您创建了一个简单的面部跟踪系统,可自动检测和跟踪单个脸部。尝试更改输入视频,并查看您是否仍然能够检测和跟踪脸部。确保该人在检测步骤中的初始帧中面临相机。

参考

维奥拉,保罗a和琼斯,迈克尔J。“基于简单特征的增强级联快速目标检测”,IEEE CVPR, 2001。

布鲁斯·d·卢卡斯和金纳德武雄。一种迭代图像配准技术及其在立体视觉中的应用。国际人工智能联席会议,1981年。

卡洛托马斯和果汁kanade。点特征的检测和跟踪。卡内基梅隆大学技术报告CMU-CS-91-132,1991。

史剑波和卡洛·托马西。值得追踪的好功能。计算机视觉与模式识别,1994。

Zdenek Kalal, Krystian Mikolajczyk和Jiri Matas。前向向后错误:自动检测跟踪失败。模式识别国际会议,2010