此示例显示如何自动检测和跟踪脸部。
对象检测和跟踪在许多计算机视觉应用中非常重要,包括活动识别,汽车安全和监视。在此示例中,您将通过将跟踪问题分为三个单独的问题来开发一个简单的面部跟踪系统:
检测面部追踪
识别跟踪的面部特征
追踪面部
在开始跟踪脸之前,您需要先检测到它。使用Vision.cascadeObjectDetector
检测视频帧中面的位置。级联物体检测器使用Viola-Jones检测算法和培训的分类模型进行检测。默认情况下,检测器配置为检测到FACE,但它可以配置为其他对象类型。
%创建级联检测器对象。FaceDetector = Vision.cascadeObjectDetector();%读取视频帧并运行检测器。Videofilereader = Videoreader('Visionface.avi');视频rame = ReadFrame(VideoFilereader);bbox =步骤(FaceDetector,Videoframe);%在检测到的面周围绘制返回的边界框。Videoout = InsertObjectAnnotation(视频rame,'长方形',bbox,'脸');图,imshow(videoout),标题('检测到脸');
您可以使用级联对象检测器跟踪连续视频帧的脸部。然而,当面部倾斜或者人转动头部时,你可能会失去跟踪。这种限制是由于用于检测的训练分类模型的类型。为避免此问题,因为对每个视频帧的执行面部检测是计算密集的,因此该示例使用简单的面部特征进行跟踪。
一旦脸部位于视频中,下一步就是识别一个可以帮助您跟踪脸部的功能。例如,您可以使用形状,纹理或颜色。选择对象唯一的功能,即使对象移动也是不变的。
在此示例中,您可以使用肤色作为跟踪的功能。肤色在面部和背景之间提供了很多对比,并且由于面部旋转或移动而不会改变。
通过从转换为HSV颜色空间的视频帧中提取色调来获取肤色信息。
[Huechannel,〜,〜] = RGB2HSV(视频rame);%显示色调通道数据并绘制脸部周围的边界框。图,imshow(huechannel),标题('色调频道数据');长方形('位置',bbox(1,:),'行宽'2,'Edgecolor',[1 1 0])
使用肤色选择作为跟踪的功能,您现在可以使用Vision.HistimographasedTracker.
跟踪。基于直方图的跟踪器使用CAPShift算法,其提供了使用像素值的直方图跟踪对象的能力。在该示例中,色调信道像素被从检测面的鼻部区域提取。这些像素用于初始化跟踪器的直方图。该示例使用此直方图跟踪连续视频帧的对象。
检测面部区域内的鼻子。鼻子提供了更准确的肤色测量,因为它不包含任何背景像素。
nosedetector = Vision.cascadeObjectDetector('鼻子'那'useroi', 真的);FiseBox =步骤(NoseTector,Videoframe,Bbox(1,:));%创建跟踪器对象。跟踪器= Vision.HistimaGbasedTracker;%使用来自的色调通道像素初始化跟踪器直方图% 鼻子。InitializeObject(跟踪器,Huechannel,ForeBbox(1,:));%创建一个用于显示视频帧的视频播放器对象。VideoPlayer = Vision.videoplayer;%在连续的视频帧上追踪面部,直到视频完成。尽管Hasfame(Videofilereader)%提取下一个视频帧视频rame = ReadFrame(VideoFilereader);%RGB - > HSV[Huechannel,〜,〜] = RGB2HSV(视频rame);使用色调通道数据的%轨道bbox =步骤(跟踪器,Huechannel);%在被跟踪的对象周围插入边界框Videoout = InsertObjectAnnotation(视频rame,'长方形',bbox,'脸');%使用Video Player对象显示带注释的视频帧步骤(视频播放器,videoout);结尾%释放资源释放(Videoplayer);
在此示例中,您创建了一个简单的面部跟踪系统,可自动检测和跟踪单个脸部。尝试更改输入视频,看看您是否能够跟踪脸部。如果注意跟踪结果差,请检查色调通道数据,看看面部区域和背景之间是否有足够的对比度。
[1] G.R.Bradski“实时面部和对象跟踪作为感知用户界面的一个组成部分”,第四次IEEE研讨会的常规研究计算机Vision应用程序,1998。
[2] Viola,Paul A.和Jones,Michael J.“使用升级的级联的快速对象检测”,IEEE CVPR,2001。