Main Content

使用凸轮矩面部检测和跟踪

此示例显示了如何自动检测和跟踪面部的示例。

Introduction

对象检测和跟踪在许多计算机视觉应用中很重要,包括活动识别,汽车安全和监视。在此示例中,您将通过将跟踪问题分为三个单独的问题来开发一个简单的面部跟踪系统:

  1. 检测到追踪的脸

  2. Identify facial features to track

  3. 跟踪脸

Step 1: Detect a Face To Track

Before you begin tracking a face, you need to first detect it. Use thevision.CascadeObjectDetector检测视频框架中面部的位置。级联对象检测器使用中提琴检测算法和经过训练的分类模型进行检测。默认情况下,将检测器配置为检测面,但可以为其他对象类型配置。

%创建级联检测器对象。faceDetector = vision.CascadeObjectDetector();%读取视频框架并运行检测器。videofilereader = videoreader('visionface.avi'); videoFrame = readFrame(videoFileReader); bbox = step(faceDetector, videoFrame);% Draw the returned bounding box around the detected face.videoOut = insertObjectAnnotation(videoFrame,'rectangle',bbox,'Face'); figure, imshow(videoOut), title(“检测到脸”);

您可以使用级联对象检测器在连续的视频帧中跟踪面部。但是,当脸部倾斜或人转过头时,您可能会失去跟踪。此限制是由于用于检测的训练有素的分类模型的类型。为了避免此问题,并且由于每个视频框架执行面部检测是计算密集的,因此此示例使用一个简单的面部功能进行跟踪。

步骤2:确定跟踪的面部特征

一旦面部位于视频中,下一步就是确定可以帮助您跟踪面部的功能。例如,您可以使用形状,纹理或颜色。选择一个对象唯一的功能,即使对象移动也是不变的。

在本例中,您使用肤色的特性to track. The skin tone provides a good deal of contrast between the face and the background and does not change as the face rotates or moves.

通过从转换为HSV颜色空间的视频框架中提取色调来获取肤色信息。

[hueChannel,~,~] = rgb2hsv(videoFrame);%显示色调通道数据,并绘制面部周围的边界框。图,Imshow(Huechannel),标题('Hue channel data'); rectangle('Position',,,,bbox(1,:),'行宽',,,,2,'edgeColor',,,,[1 1 0])

Step 3: Track the Face

With the skin tone selected as the feature to track, you can now use thevision.HistogramBasedTracker用于跟踪。基于直方图的跟踪器使用凸轮移算法,该算法提供了使用像素值直方图跟踪对象的功能。在此示例中,从检测到的面部的鼻子区域中提取色合通道像素。这些像素用于初始化跟踪器的直方图。该示例使用此直方图在连续的视频帧中跟踪对象。

检测面部区域内的鼻子。鼻子提供了更准确的肤色量度,因为它不包含任何背景像素。

Nosedetector = Vision.CascadeObjectDetector('Nose',,,,“用户”, 真的);nosebbox = step(nosedetector,videoframe,bbox(1,:));%创建一个跟踪器对象。跟踪器= Vision.histogrambasedTracker;%使用来自The The Hue通道像素初始化跟踪器直方图% nose.initializeObject(tracker, hueChannel, noseBBox(1,:));% Create a video player object for displaying video frames.videoPlayer = vision.VideoPlayer;% Track the face over successive video frames until the video is finished.whileHasframe(videofilereader)%提取下一个视频框架videoframe = readframe(videofilereader);% RGB -> HSV[hueChannel,~,~] = rgb2hsv(videoFrame);使用色调频道数据的%跟踪bbox = step(Tracker,HueChannel);%在要跟踪的对象周围插入一个边界盒videoOut = insertObjectAnnotation(videoFrame,'rectangle',bbox,'Face');%使用视频播放器对象显示带注释的视频框架步骤(videoplayer,videoout);结尾%释放资源release(videoPlayer);

Summary

在此示例中,您创建了一个简单的面部跟踪系统,该系统会自动检测并跟踪单个面部。尝试更改输入视频,看看您是否能够跟踪脸部。如果您注意到跟踪结果不佳,请检查色调频道数据以查看面部区域和背景之间是否有足够的对比度。

Reference

[1] G.R.布拉德斯基“作为感知用户界面的组成部分的实时面部和对象跟踪”,《计算机视觉应用》第四届IEEE研讨会论文集,1998年。

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