主要内容

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

这个例子展示了如何使用特征点自动检测和跟踪人脸。这个例子中的方法即使当人倾斜他或她的头,或走向或远离相机,也会跟踪脸部。

介绍

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

  1. 发现一张脸

  2. 识别要跟踪的面部特征

  3. 跟踪的脸

发现一张脸

首先,你必须检测人脸。使用视觉传感器对象,用于检测视频帧中人脸的位置。级联对象检测器使用Viola-Jones检测算法和经过训练的分类模型进行检测。默认情况下,检测器配置为检测人脸,但可用于检测其他类型的对象。

%创建级联检测器。faceDetector=vision.CascadeObjectDetector();%读取视频帧并运行面部检测器。videoReader = videoReader (“歪脸,阿维”);videoFrame = readFrame (videoReader);bbox = step(faceDetector, videoFrame);%围绕检测到的面绘制返回的边界框。videoFrame = insertShape (videoFrame,“矩形”,bbox);图形imshow(视频帧);头衔(“检测到的脸”);

图中包含一个轴对象。标题为“检测到的脸”的轴对象包含类型为图像的对象。

%将第一个方块转换成4个点的列表%这需要能够可视化对象的旋转。bboxPoints=bbox2点(bbox(1,:);

为了跟踪人脸,本例使用了Kanade-Lucas-Tomasi (KLT)算法。虽然可以在每一帧上使用级联对象检测器,但这在计算上是昂贵的。当受试者转动或倾斜头部时,它也可能无法检测到面部。这个限制来自于用于检测的训练分类模型的类型。该示例只检测人脸一次,然后KLT算法在视频帧中跟踪人脸。

识别面部特征跟踪

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

检测人脸区域中的特征点。

点=检测到的最小特征(rgb2gray(视频帧),“投资回报”,bbox);%显示检测到的点。图,imshow(视频帧),保持在…上、标题(检测功能的);绘图(点);

图中包含一个轴对象。标题为“检测到的特征”的轴对象包含两个类型为image, line的对象。

初始化跟踪器来跟踪点

识别特征点后,现在可以使用视觉点跟踪器系统对象来跟踪它们。对于前一帧中的每个点,点跟踪器尝试找到当前帧中对应的点。然后估计几何变换2D函数用来估计旧点和新点之间的平移、旋转和比例。这个转换应用于脸部周围的包围框。

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

pointTracker =愿景。PointTracker ('最大双向错误'2);%使用初始点位置和初始值初始化跟踪器%视频帧。点=点。位置;初始化(点跟踪器、点、视频帧);

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

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

视频播放器(“位置”...[100 100 [size(videoFrame, 2), size(videoFrame, 1)]+30]);

跟踪的脸

从一帧到另一帧跟踪点,并使用估计几何变换2D函数来估计人脸的运动。

复制用于计算前一帧和当前帧中的点之间的几何变换的点

oldPoints=点;虽然hasFrame (videoReader)%获取下一帧videoFrame = readFrame (videoReader);%追踪要点。请注意,某些点可能会丢失。[points, isFound] = step(pointTracker, videoFrame);visiblePoints = points(isFound,:);olddinliers = oldPoints(isFound,:);如果大小(可视点,1)>=2%至少需要2分%估计旧点之间的几何变换%和新点,并消除异常值[xform, inlierIdx] = estimateGeometricTransform2D(...旧标签、可视点、,“相似性”“MaxDistance”, 4); oldInliers=oldInliers(inlierIdx,:);visiblePoints=visiblePoints(inlierIdx,:);对包围盒点应用变换bboxPoints = transformpointforward (xform, bboxPoints);在被跟踪的对象周围插入一个边界框bboxPolygon =重塑(bboxPoints', 1, []);videoFrame = insertShape (videoFrame,“多边形”,bbox多边形,...“线宽”2);%显示跟踪点videoFrame = insertMarker(videoFrame, visiblePoints,'+'...“颜色”“白色”);重置点数oldPoints=可见点;设定点(点跟踪器,oldPoints);结束使用视频播放器对象显示带注释的视频帧步骤(放像机、videoFrame);结束%清理释放(视频播放器);

Figure视频播放器包含axes对象和uiflowcontainer、uimenu、uitoolbar类型的其他对象。axes对象包含image类型的对象。

释放(pointTracker);

总结

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

工具书类

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

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

Carlo Tomasi和Takeo Kanade.点特征的检测和跟踪.卡内基梅隆大学技术报告CMU-CS-91-1321991。

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

兹德内克·卡拉尔,克里斯蒂安·米科拉奇克和吉里·马塔斯。Forward-Backward Error:自动检测跟踪失败。国际模式识别会议,2010