主要内容

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

这个例子展示了如何使用特征点自动检测和跟踪人脸。这个例子中的方法即使在人倾斜他或她的头,或靠近或远离摄像机时也能跟踪面部。

简介

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

  1. 识别人脸

  2. 识别面部特征

  3. 追踪面部

识别人脸

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

创建级联检测器对象。faceDetector = vision.CascadeObjectDetector();读取视频帧并运行人脸检测器。视频阅读器=视频阅读器(“tilted_face.avi”);videoFrame = readFrame(videreader);bbox = step(faceDetector, videoFrame);在检测到的人脸周围绘制返回的包围框。视频框架=插入形状(视频框架,“矩形”, bbox);图;imshow (videoFrame);标题(“发现脸”);

图中包含一个轴对象。标题为Detected face的坐标轴对象包含一个image类型的对象。

将第一个框转换为4个点的列表这是需要能够可视化的旋转对象。bboxPoints = bbox2points(bbox(1,:));

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

识别面部特征

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

检测人脸区域的特征点。

点= detectMinEigenFeatures(rgb2gray(videoFrame),“投资回报”, bbox);显示检测点。图,imshow(视频帧),稍等、标题(检测功能的);情节(点);

图中包含一个轴对象。标题为Detected features的axis对象包含2个类型为image、line的对象。

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

识别了特性点之后,现在可以使用愿景。PointTracker系统对象来跟踪它们。对于前一帧中的每个点,点跟踪器尝试在当前帧中找到相应的点。然后estimateGeometricTransform2D函数用于估计旧点和新点之间的平移、旋转和缩放。此转换应用于面部周围的包围框。

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

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

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

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

videoPlayer =视觉。放像机(“位置”...[100 100 [size(videoFrame, 2), size(videoFrame, 1)]+30]);

追踪面部

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

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

oldPoints =点数;hasFrame (videoReader)得到下一帧videoFrame = readFrame(videreader);跟踪分数。注意,有些分数可能会被扣掉。[points, isFound] = step(pointTracker, videoFrame);visiblePoints = points(isFound,:);oldInliers = oldPoints(isFound,:);如果size(visiblePoints, 1) >= 2%至少需要2分估计旧点之间的几何变换%和新的点,并消除异常值[xform, inlierIdx] = estimateGeometricTransform2D(...oldInliers visiblePoints,“相似”“MaxDistance”4);oldInliers = oldInliers(inlierIdx,:);visiblePoints = visiblePoints(inlierIdx,:);将转换应用到边界框点bboxPoints = transformPointsForward(xform, bboxPoints);在被跟踪的对象周围插入一个包围框bboxPolygon =重塑(bboxPoints', 1, []);视频框架=插入形状(视频框架,“多边形”bboxPolygon,...“线宽”2);%显示跟踪点视频帧= insertMarker(视频帧,visiblePoints,“+”...“颜色”“白色”);%重置点数oldPoints = visiblePoints;选点(pointTracker oldPoints);结束使用视频播放器对象显示带注释的视频帧步骤(放像机、videoFrame);结束%清理释放(放像机);

{

释放(pointTracker);

总结

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

参考文献

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

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

Carlo Tomasi和Takeo Kanade。点特征的检测与跟踪。卡内基梅隆大学技术报告cmu - cs91 -132, 1991。

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

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