主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

ライブビデオ取得を使用した,顔の検出と追跡

この例では,KLTアルゴリズムを使用してライブビデオストリーム内の顔を自動的に検出し追跡する方法を説明します。

概要

オブジェクトの検出と追跡は,アクティビティ認識,自動車安全性,監視など,多くのコンピュータービジョンアプリケーションにおいて重要です。この例では、Webカメラでキャプチャしたライブビデオストリーム中の1つの顔を追跡する,シンプルなシステムを作成します。MATLABは,ハードウェアサポートパッケージによってWebカメラのサポートを提供しています。この例を実行するには,このパッケージをダウンロードしてインストールする必要があります。サポートパッケージはサポートパッケージインストーラーから入手できます。

この例の顔追跡システムは,検出と追跡という2つのモードのうちいずれかの状態にあります。検出モードでは,愿景。CascadeObjectDetectorオブジェクトを使用して現在のフレーム内にある顔を検出できます。顔が検出された場合,顔のコーナーポイントを検出し,愿景。PointTrackerオブジェクトを初期化してから,追跡モードに切り替えなければなりません。

追跡モードでは,ポイントトラッカーを使用して点を追跡しなければなりません。点を追跡する時に,それらのいくつかはオクルージョンのためになくなります。追跡している点の数がしきい値より低くなると,その顔はもはや追跡されていないことになります。その場合は検出モードに戻って顔を取得し直さなければなりません。

設定

顔の検出,点の追跡,ビデオフレームの取得と表示を行うオブジェクトを作成します。

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

検出と追跡

顔を検出し追跡するため,ループを使ってWebカメラからビデオフレームをキャプチャし,処理します。400年ループはフレーム分,あるいはビデオプレーヤーのウィンドウが閉じるまで実行されます。

runLoop = true;numPts = 0;frameCount = 0;runLoop && frameCount < 400获得下一帧。videoFrame =快照(cam);videoFrameGray = rgb2gray (videoFrame);frameecount = frameecount + 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]转换为an4个角的[x,y]坐标的m × 2矩阵。这%需要能够将边界框转换为显示%面部的方向。bboxPoints = bbox2points(bbox(1,:)));%将方框角转换为[x1 y1 x2 y2 x3 y3 x4 y4]insertShape要求的%格式。bboxPolygon =重塑(bboxPoints', 1, []);%在检测到的人脸周围显示一个边界框。videoFrame = insertShape (videoFrame,“多边形”bboxPolygon,“线宽”3);%显示检测到的角。= insertMarker(videoFrame, xyPoints,)“+”“颜色”“白色”);结束其他的%跟踪模式。[xyPoints, isFound] = step(pointTracker, videoFrameGray);visiblePoints = xyPoints(isFound,:);olddinliers = oldPoints(isFound,:);numPts = size(visiblePoints, 1); / /显示时间如果numPts > = 10估计旧点之间的几何变换%和新积分。[xform, inlierIdx] = estimateGeometricTransform2D(...oldInliers visiblePoints,“相似”“MaxDistance”4);oldInliers = oldInliers(inlierIdx,:); / / / / / /visiblePoints = visiblePoints(inlierIdx,:);对包围框应用变换。bboxPoints = transformpointforward (xform, bboxPoints);%将方框角转换为[x1 y1 x2 y2 x3 y3 x4 y4]insertShape要求的%格式。bboxPolygon =重塑(bboxPoints', 1, []);在被跟踪的脸部周围显示一个边界框。videoFrame = insertShape (videoFrame,“多边形”bboxPolygon,“线宽”3);%显示跟踪点。videoFrame = insertMarker(videoFrame, visiblePoints,“+”“颜色”“白色”);%重置点数。oldPoints = visiblePoints;选点(pointTracker oldPoints);结束结束使用视频播放器对象显示带注释的视频帧。步骤(放像机、videoFrame);%检查视频播放窗口是否已关闭。runLoop = isOpen(放像机);结束%清理。清晰的凸轮;释放(放像机);释放(pointTracker);释放(faceDetector);

参考文献

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

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

卡洛·托马西和金ade武夫。点特征检测与跟踪。卡耐基梅隆大学技术报告

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

兹德内克·卡拉尔,克里斯蒂安·米科拉奇克和吉里·马塔斯。Forward-Backward Error:自动检测跟踪失败。国际模式识别会议,2010