主要内容

使用实时视频采集的人脸检测和跟踪

这个例子展示了如何使用KLT算法自动检测和跟踪一个实时视讯流中的人脸。

概述

目标检测和跟踪在许多计算机视觉应用中是重要的,包括活动识别,汽车安全和监视。在本例中,您将开发一个简单的系统,用于跟踪由网络摄像头捕获的实时视频流中的单个面孔。MATLAB通过一个硬件支持包提供摄像头支持,金宝app为了运行这个例子,你需要下载并安装它。支持包可金宝app以通过金宝app支持包安装程序

本例中的人脸跟踪系统可以采用两种模式之一:检测或跟踪。在检测模式下,可以使用愿景。CascadeObjectDetector对象来检测当前帧中的人脸。如果检测到一个人脸,那么你必须检测到人脸上的角点,初始化一个愿景。PointTracker对象,然后切换到跟踪模式。

在跟踪模式下,您必须使用点跟踪器跟踪这些点。当你追踪这些点时,它们中的一些会因为遮挡而丢失。如果被跟踪的点数低于一个阈值,这意味着脸不再被跟踪。然后你必须切换回检测模式,尝试重新获取人脸。

设置

创建用于检测人脸、跟踪点、获取和显示视频帧的对象。

创建人脸检测器对象。faceDetector = vision.CascadeObjectDetector ();%创建点跟踪器对象。pointTracker =愿景。PointTracker (“MaxBidirectionalError”2);创建webcam对象。凸轮=摄像头();捕获一个帧以获得其大小。videoFrame =快照(cam);frameSize =大小(videoFrame);创建视频播放器对象。放像机=愿景。放像机(“位置”, [100 100 [frameSize(2), frameSize(1)]+30]);

检测和跟踪

通过网络摄像头循环捕捉和处理视频帧来检测和跟踪人脸。循环将运行400帧或直到视频播放器窗口关闭。

runLoop = true;numPts = 0;frameCount = 0;runLoop && frameCount < 400获取下一帧。videoFrame =快照(cam);videoFrameGray = rgb2gray (videoFrame);frameCount = frameCount + 1;如果numPts < 10%检测模式。bbox = faceDetector.step (videoFrameGray);如果~ isempty (bbox)%查找被检测区域内的角点。点= detectMinEigenFeatures (videoFrameGray,“投资回报”bbox (:));重新初始化点跟踪器。xyPoints = points.Location;numPts =大小(xyPoints, 1);释放(pointTracker);初始化(pointTracker xyPoints videoFrameGray);保存一个点的副本。oldPoints = xyPoints;%将表示为[x, y, w, h]的矩形转换为% m × 2矩阵的四个角的坐标[x,y]。这%需要能够将边界框转换为显示%脸部的朝向。bboxPoints = bbox2points(bbox(1,:)));%将箱子角转换成[x1 y1 x2 y2 x3 y3 x4 y4]%格式要求insertShape。bboxPolygon =重塑(bboxPoints', 1, []);在被检测的面部周围显示一个包围框。videoFrame = insertShape (videoFrame,“多边形”bboxPolygon,“线宽”3);显示检测到的角落。videooframe = insertMarker(videooframe, xyPoints,“+”“颜色”“白色”);结束其他的%跟踪模式。[xyPoints, isFound] = step(pointTracker, videoFrameGray);可见点= xyPoints(isFound,:);olddinliers = oldPoints(isFound,:);numPts =大小(可见点,1);如果numPts > = 10%估计旧点之间的几何变换%和新点。[xform, inlierIdx] = estimateGeometricTransform2D()...oldInliers visiblePoints,“相似”“MaxDistance”4);oldInliers = oldInliers(inlierIdx,:);可见点=可见点(inlierIdx,:);将转换应用于包围框。bboxPoints = transformpointforward (xform, bboxPoints);%将箱子角转换成[x1 y1 x2 y2 x3 y3 x4 y4]%格式要求insertShape。bboxPolygon =重塑(bboxPoints', 1, []);在被跟踪的面部周围显示一个包围框。videoFrame = insertShape (videoFrame,“多边形”bboxPolygon,“线宽”3);%显示跟踪点。videooframe = insertMarker(videooframe,可视点,可视点)“+”“颜色”“白色”);%重置点。oldPoints = visiblePoints;选点(pointTracker oldPoints);结束结束%使用视频播放器对象显示带注释的视频帧。步骤(放像机、videoFrame);%查看视频播放器窗口是否已关闭。runLoop = isOpen(放像机);结束%清理。清晰的凸轮;释放(放像机);释放(pointTracker);释放(faceDetector);

参考文献

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

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

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

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

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