主要内容

使用实时视频获取的面部检测和跟踪

此示例显示了如何使用KLT算法在实时视频流中自动检测和跟踪面孔。

概述

对象检测和跟踪在许多计算机视觉应用中很重要,包括活动识别,汽车安全和监视。在此示例中,您将开发一个简单的系统,用于在网络摄像头捕获的实时视频流中跟踪单个面孔。MATLAB通过硬件支持软件包提供网络摄像头支万博1manbetx持,您需要下载和安装才能运行此示例。支持包可万博1manbetx通过万博1manbetx支持包装安装程序

此示例中的面部跟踪系统可以以两种模式之一:检测或跟踪。在检测模式下,您可以使用Vision.CascadeObjectDetector对象在当前框架中检测面孔。如果检测到脸,则必须检测到脸上的角点,初始化一个Vision.PointTracker对象,然后切换到跟踪模式。

在跟踪模式下,您必须使用点跟踪器跟踪点。当您跟踪要点时,其中一些会因阻塞而丢失。如果跟踪的点数低于阈值,则意味着不再跟踪脸部。然后,您必须切换回检测模式,以尝试重新接触脸部。

设置

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

%创建面部检测器对象。facedetector = Vision.cascadeObjectDetector();%创建点跟踪器对象。PointTracker = Vision.PointTracker(“ maxBidirectionalError”,2);%创建网络摄像头对象。CAM = WebCam();%捕获一个框架以获得其尺寸。videoframe =快照(cam);frameSize = size(videoframe);%创建视频播放器对象。videoplayer = vision.videoplayer('位置',[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;如果数字<10%检测模式。bbox = facedetector.step(videoframegray);如果〜Isempty(bbox)%在检测区域内找到角点。点= detectmineigenfeatures(videoframegray,'roi',bbox(1,:));%重新定位点跟踪器。xypoints = points.location;numpts = size(xypoints,1);释放(PointTracker);初始化(PointTracker,Xypoints,videoframeGray);%保存点的副本。旧点= xypoints;%将表示为[x,y,w,h]的矩形转换为一个[X,Y]的四个角坐标的%M-BY-2矩阵。这需要%才能转换边界框以显示%面部的方向。bboxpoints = bbox2points(bbox(1,:));%将框角转换为[x1 y1 x2 y2 x3 y3 x4 y4]插入形状所需的%格式。bboxPolygon = reshape(bboxpoints',1,[]);%在检测到的面周围显示一个边界盒。videoframe = insertshape(videoframe,“多边形”,bboxpolygon,'行宽',3);%显示的拐角处。videoframe = insertmarker(videoframe,xypoints,'+',,,,'颜色',,,,'白色的');结尾别的%跟踪模式。[xypoints,iSfound] = step(pointTracker,videoframegray);可见点= xypoints(isfound,:);OldInliers = OldPoints(ISFOUND,:);numpts = size(可见点,1);如果numpts> = 10%估计旧点之间的几何变换%和新点。[xform,inlierIdx] = estimateGeometrictransform2d(...旧的,可见点,'相似',,,,“ maxdistance',4);OldInliers = OldInliers(InlierIdx,:);可见点=可见点(InlierIdx,:);%将转换应用于边界框。bboxpoints = transformpointsforward(xform,bboxPoints);%将框角转换为[x1 y1 x2 y2 x3 y3 x4 y4]插入形状所需的%格式。bboxPolygon = reshape(bboxpoints',1,[]);%在跟踪的面部周围显示一个边界盒。videoframe = insertshape(videoframe,“多边形”,bboxpolygon,'行宽',3);%显示跟踪点。videoframe = insertmarker(videoframe,可见点,'+',,,,'颜色',,,,'白色的');%重置要点。旧点=可见点;设定点(PointTracker,OldPoints);结尾结尾%使用视频播放器对象显示带注释的视频框架。步骤(videoplayer,videoframe);%检查视频播放器窗口是否已关闭。runloop = iSopen(videoplayer);结尾% 清理。清除凸轮;释放(videoplayer);释放(PointTracker);释放(faceDetector);

参考

Viola,Paul A.和Jones,Michael J.“使用增强的简单功能的级联级别的快速对象检测”,IEEE CVPR,2001年。

Bruce D. Lucas和Takeo Kanade。具有立体声视觉应用的迭代图像注册技术。国际人工智能会议,1981年。

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

Jianbo Shi和Carlo Tomasi。可以追踪的好功能。IEEE计算机视觉和模式识别会议,1994年。

Zdenek Kalal,Krystian Mikolajczyk和Jiri Matas。前后错误错误:自动检测跟踪故障。国际模式认可会议,2010年