Main Content

シーン内の顔の追跡

ビデオの読み取りと表示およびオブジェクトの境界ボックスの描画を行う System object をそれぞれ作成します。

videoReader = VideoReader('visionface.avi');
videoPlayer = vision.VideoPlayer('Position',[100,100,680,520]);

オブジェクトを含む最初のビデオ フレームを読み取って、領域を定義します。

objectFrame = readFrame(videoReader);
objectRegion = [264,122,93,93];

代替方法として、以下のコマンドを使用して、オブジェクト領域をマウスで選択することも可能です。オブジェクトは領域の大部分を占めていなければなりません。

figure; imshow(objectFrame);

objectRegion=round(getPosition(imrect))

赤い境界ボックスで初期フレームを表示します。

objectImage = insertShape(objectFrame,'rectangle',objectRegion,'ShapeColor','red');
figure;
imshow(objectImage);
title('Red box shows object region');

オブジェクト領域内の関心点を検出します。

points = detectMinEigenFeatures(im2gray(objectFrame),'ROI',objectRegion);

検出した点を表示します。

pointImage = insertMarker(objectFrame,points.Location,'+','MarkerColor','white');
figure;
imshow(pointImage);
title('Detected interest points');

トラッカー オブジェクトを作成します。

tracker = vision.PointTracker('MaxBidirectionalError',1);

トラッカーを初期化します。

initialize(tracker,points.Location,objectFrame);

各ビデオ フレームのデータを読み取って追跡し、点を表示してその結果を表示します。

while hasFrame(videoReader)
      frame = readFrame(videoReader);
      [points,validity] = tracker(frame);
      out = insertMarker(frame,points(validity, :),'+');
      videoPlayer(out);
end

ビデオ プレーヤーを解放します。

release(videoPlayer);