人脸检测与跟踪使用KLT算法

这个例子说明如何自动检测和使用特征点跟踪的脸。在这个例子中的方法跟踪脸部即使在人倾斜他或她的头,或朝向或远离相机移动。

介绍

目标检测和跟踪在许多计算机视觉应用中都很重要,包括活动识别、汽车安全和监视。在本例中,您将开发一个简单的人脸跟踪系统,将跟踪问题分为三个部分:

  1. 发现一张脸

  2. 识别面部特征以跟踪

  3. 轨道面

发现一张脸

首先,你必须识别脸部。使用vision.CascadeObjectDetector目标检测人脸在视频帧中的位置。级联目标检测器使用Viola-Jones检测算法和经过训练的分类模型进行检测。默认情况下,检测器被配置为检测面孔,但它可以用于检测其他类型的对象。

%创建级联检测器对象。faceDetector = vision.CascadeObjectDetector ();读取视频帧并运行人脸检测器。videoReader = VideoReader(“tilted_face.avi”);videoFrame = readFrame(videoReader);BBOX =步骤(faceDetector,videoFrame);在检测到的人脸周围绘制返回的边界框。videoFrame = insertShape(videoFrame,“矩形”, bbox);图;imshow (videoFrame);标题(“检测到的脸”);

%将第一个箱子到4点的列表%这需要能够可视化物体的旋转。bboxPoints = bbox2points(BBOX(1,:));

为了跟踪面随着时间的推移,该示例使用奏卢卡斯-Tomasi的(KLT)算法。虽然可以使用级联对象检测器在每一帧,它在计算上是昂贵的。它也可能无法侦测到脸部,对象转弯或倾斜他的头的时候。这种限制来自于用于检测训练的分类模型的类型。的例子检测面部只有一次,然后将KLT算法跟踪各视频帧的面部。

识别面部特征追踪

康莱特算法跟踪各视频帧的一组特征点。一旦检测所在的面,在该示例识别下一个步骤有可能可靠地跟踪点。这个例子使用了标准,“好的特征跟踪”增施和托马西建议。

检测人脸区域的特征点。

点= detectMinEigenFeatures (rgb2gray (videoFrame),“投资回报率”, bbox);%显示探测点。人物,imshow (videoFrame),标题(“检测到的特征”);情节(点);

初始化跟踪器轨迹的点

识别出特征点后,现在可以使用vision.PointTracker系统对象跟踪它们。对于前一帧中的每个点,该点跟踪器试图找到在当前帧中的对应点。随后,estimateGeometricTransform函数是用来估计旧点,新点之间的平移,旋转和缩放。这种转变被应用到脸部周围的边框。

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

pointTracker = vision.PointTracker(“MaxBidirectionalError”,2);%用初始点位置和初始值初始化跟踪器%的视频帧。点= points.Location;初始化(pointTracker点,videoFrame);

初始化一个视频播放器来显示结果

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

放像机= vision.VideoPlayer (“位置”...[100 100尺寸(videoFrame,2),尺寸(videoFrame,1)] + 30]);

轨道面

从帧到帧,并且使用跟踪点estimateGeometricTransform函数来估计面部的运动。

使要被用于计算在先前的点和当前帧之间的几何变换的点的副本

oldPoints =点;hasFrame(videoReader)%获取下一帧videoFrame = readFrame(videoReader);跟踪点。注意,有些分数可能会丢失。[分,isFound] =步骤(pointTracker,videoFrame);visiblePoints =点(isFound,:);oldInliers = oldPoints(isFound,:);如果size(visiblePoints, 1%需要至少2点%估计老点之间的几何变换%,而新的点,消除异常值[x形,线性,可见点]=估计几何变换(...oldInliers visiblePoints,“相似”'MaxDistance',4);%应用转化为边界框点bboxPoints = transformPointsForward(XForm的,bboxPoints);%插入对象周围的边框被跟踪bboxPolygon =重塑(bboxPoints',1,[]);videoFrame = insertShape(videoFrame,“多边形”bboxPolygon,...'行宽',2);显示跟踪点videoFrame = insertMarker(videoFrame,visiblePoints,“+”...“颜色”'白色');%重置点oldPoints = visiblePoints;选点(pointTracker oldPoints);结束%使用视频播放器对象显示注释的视频帧步骤(录像机,videoFrame);结束%清理释放(放像机);

释放(pointTracker);

总结

在本例中,您创建了一个简单的面部跟踪系统,它可以自动检测和跟踪单个面部。试着改变输入的视频,看看你是否仍然能够检测和跟踪一张脸。确保这个人在检测步骤的初始帧中面对着摄像机。

参考文献

中提琴,保罗·琼斯,迈克尔J.“使用简单功能的升压级联快速目标检测”,IEEE CVPR,2001年。

布鲁斯D.卢卡斯和金出武雄。一种迭代图像配准技术在立体视觉的应用。国际人工智能联合会议,1981年。

卡罗·托马西和Takeo Kanade。点特征的检测与跟踪。卡内基梅隆大学技术报告CMU-CS-91-132, 1991。

剑波石和Carlo Tomasi的。好的特点进行跟踪。IEEE会议计算机视觉与模式识别,1994年。

兹德涅克Kalal,克里斯蒂安米科瓦伊奇克和吉日麦塔斯。正倒向错误:跟踪故障的自动检测。国际会议模式识别,2010