使用KLT人脸检测和跟踪算法
这个例子展示了如何使用特征点自动检测和跟踪一脸。在这个例子中跟踪的方法面对即使人倾斜他或她的头,或走向远离相机。
介绍
对象检测和跟踪是重要的活动在许多计算机视觉应用程序包括识别、汽车安全、监视。在本例中,您将开发一个简单的脸跟踪系统跟踪问题划分成三个部分:
发现一张脸
识别面部特征跟踪
跟踪的脸
发现一张脸
首先,你必须检测。使用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));
跟踪的脸随着时间的推移,这个例子使用Kanade-Lucas-Tomasi (KLT)算法。虽然可以使用级联对象探测器在每一帧,在计算上是昂贵的。它也可能无法检测到的脸,当主体或歪了歪脑袋。这种限制来自训练分类模型用于检测的类型。示例只检测一次脸,然后KLT算法跟踪整个视频帧。
识别面部特征跟踪
KLT算法跟踪一组视频帧的特征点。一旦检测定位的脸,下一步确定特征点的示例中,可以可靠地跟踪。下面的例子使用了标准,提出的“好特征跟踪”史和预。
在面对地区检测特征点。
点= detectMinEigenFeatures (im2gray (videoFrame),“投资回报”,bbox);%显示检测到的点。人物,imshow (videoFrame)在、标题(“检测功能”);情节(点);
初始化一个跟踪器跟踪点
特征点的识别,您现在可以使用vision.PointTracker
系统对象跟踪他们。每个点的前一帧,跟踪器试图找到当前帧中的对应点。然后estimateGeometricTransform2D
函数是用来估计平移、旋转、和规模之间的点和新老点。这个变换应用于周围的边界框的脸。
创建一个点追踪,使双向误差约束更健壮的噪音和混乱。
pointTracker = vision.PointTracker (“MaxBidirectionalError”2);%初始化跟踪器的初始位置和初始点%的视频帧。点= points.Location;初始化(pointTracker点,videoFrame);
初始化一个视频播放器来显示结果
创建一个视频播放器对象显示视频帧。
放像机= vision.VideoPlayer (“位置”,…(100 100(大小(videoFrame, 2),大小(videoFrame 1) + 30]);
跟踪的脸
跟踪点从帧到帧,和使用estimateGeometricTransform2D
函数估计的运动的脸。
复制的点之间的几何变换用于计算点在前面和当前帧
oldPoints =点;而hasFrame (videoReader)%得到下一帧videoFrame = readFrame (videoReader);%跟踪点。注意,可能会丢失一些点。(点,isFound) = (pointTracker videoFrame)步;visiblePoints =点(isFound:);oldInliers = oldPoints (isFound:);如果大小(visiblePoints 1) > = 2%至少需要2点%估计老点之间的几何变换%和新分和消除异常值[xform, inlierIdx] = estimateGeometricTransform2D (…oldInliers visiblePoints,“相似”,“MaxDistance”4);oldInliers = oldInliers (inlierIdx:);visiblePoints = visiblePoints (inlierIdx:);%转换应用于边界框点bboxPoints = transformPointsForward (xform, bboxPoints);%插入一个边界框的对象被跟踪bboxPolygon =重塑(bboxPoints ', 1, []);videoFrame = insertShape (videoFrame,“多边形”bboxPolygon,…“线宽”2);%显示跟踪点videoFrame = insertMarker (videoFrame visiblePoints,“+”,…“颜色”,“白色”);%重置点oldPoints = visiblePoints;选点(pointTracker oldPoints);结束%显示注释视频帧使用视频播放器对象步骤(放像机、videoFrame);结束%清理释放(放像机);
释放(pointTracker);
总结
在本例中,您创建了一个简单的跟踪系统,自动检测和跟踪一个脸。试着改变输入视频,看看你还能探测和跟踪的脸。确保相机的人面临的初始帧检测步骤。
引用
Viola, Paul a .和琼斯,迈克尔·J。“快速目标检测使用了简单的级联功能”,IEEE CVPR, 2001年。
布鲁斯·d·卢卡斯和金。一个迭代的图像配准技术应用立体视觉。人工智能国际联合大会,1981年。
卡洛预和金。检测和跟踪点的特性。卡内基梅隆大学技术报告cmu - cs - 91 - 132, 1991。
简帛史和卡洛预。良好的跟踪特性。IEEE计算机视觉与模式识别会议,1994。
兹德内克Kalal。Krystian Mikolajczyk和吉马特斯。Forward-Backward错误:自动检测跟踪失败。模式识别国际会议上,2010年