Main Content

vision.PointTracker

Kanade-Lucas-Tomasi (KLT) アルゴリズムを使用したビデオ内の点の追跡

説明

ポイント トラッカー オブジェクトは、Kanade-Lucas-Tomasi (KLT) 特徴追跡アルゴリズムを使用して一連の点を追跡します。ポイント トラッカーを使用して、映像安定化、カメラの動き推定およびオブジェクト追跡を行うことができます。これは特に、形状が変化しないオブジェクトや視覚的なテクスチャを表すオブジェクトの追跡に効果的です。ポイント トラッカーは、大規模な追跡フレームワークの一部として短時間の追跡を行う場合によく使用されます。

ポイント トラッカー アルゴリズムの進行に伴い、ライティングの変化、面外の回転または関節運動によって点が失われる場合があります。長時間にわたってオブジェクトを追跡するには、点の定期的な再取得が必要になる場合があります。

一連の点の追跡:

  1. vision.PointTracker オブジェクトを作成し、そのプロパティを設定します。

  2. 関数と同様に、引数を指定してオブジェクトを呼び出します。

System object の機能の詳細については、System object とはを参照してください。

作成

説明

pointTracker = vision.PointTracker は、ビデオ内の一連の点を追跡するポイント トラッカーオブジェクトを返します。

pointTracker = vision.PointTracker(Name,Value) は、名前と値のペアを 1 つ以上使用してプロパティを設定します。各プロパティ名を引用符で囲みます。たとえば、pointTracker = vision.PointTracker('NumPyramidLevels',3) です。

追跡プロセスの初期化

追跡プロセスを初期化するには、initialize を使用して、点と初期ビデオ フレームの初期位置を指定しなければなりません。

initialize(pointTracker,points,I) は、追跡する点を初期化して、初期ビデオ フレームを設定します。初期位置 points は、[x y] 座標の M 行 2 列の配列でなければなりません。初期ビデオ フレーム I は、2 次元グレースケール イメージまたは RGB イメージで、サイズとデータ型がオブジェクトに渡されたビデオ フレームと同じでなければなりません。

追跡の初期点を取得するには、関数 detectFASTFeaturesdetectSURFFeaturesdetectHarrisFeaturesdetectMinEigenFeatures など、多くの方法があります。

プロパティ

すべて展開する

特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトの呼び出し後に値を変更することはできません。オブジェクトは呼び出すとロックされ、ロックを解除するには関数 release を使用します。

プロパティが "調整可能" の場合、その値をいつでも変更できます。

プロパティ値の変更の詳細については、System object を使用した MATLAB でのシステム設計を参照してください。

ピラミッド レベルの数。整数として指定します。KLT アルゴリズムのポイント トラッカーの実装には、イメージ ピラミッドが使用されます。トラッカーは、各レベルで解像度が前のレベルに対して 2 分の 1 に低下するイメージ ピラミッドを生成します。1 より大きいピラミッド レベルを選択すると、アルゴリズムによって、最も低いレベルから始めて複数レベルの解像度でポイントを追跡できます。ピラミッド レベルの数を増やすと、アルゴリズムによってフレーム間でのより大きいポイントの変位に対処できます。ただし、計算コストも増加します。推奨値は 14 です。

各ピラミッド レベルは、前のレベルの幅と高さを 2 分の 1 にダウンサンプリングすることによって形成されます。ポイント トラッカーは、各ポイントの追跡を最も低い解像度レベルから始めて、収束するまで継続します。オブジェクトは、そのレベルの結果を点の位置の初期推定として次のレベルに伝播します。このようにして、元のイメージになるまで、各レベルで追跡が調整されます。ピラミッド レベルを使用すると、ポイント トラッカーによって、近傍のサイズより大きい距離を構成する可能性のあるピクセルの大きな動きに対処できます。

順方向/逆方向誤差のしきい値。スカラーとして指定します。inf より小さい値に設定した場合、トラッカーは前のフレームから現在のフレームに対して各点を追跡します。その後、同じ点を前のフレームに対して逆方向に追跡します。オブジェクトは、双方向の誤差を計算します。この値は、点の元の位置と、逆方向の追跡後の最終的な位置との距離 (ピクセル単位) を示します。誤差がこのプロパティに設定された値より大きくなると、対応する点が無効であると見なされます。推奨値は 03 ピクセルです。

双方向の誤差を使用すると、確実に追跡されていない可能性のある点を効果的に排除できます。ただし、双方向の誤差には追加の計算が必要です。MaxBidirectionalError プロパティを inf に設定すると、オブジェクトは双方向の誤差を計算しません。

追跡されている各点の近傍のサイズ。2 要素ベクトル [height, width] として指定します。heightwidth は奇数の整数でなければなりません。この近傍は、空間勾配行列の計算を行う領域を定義します。BlockSize の最小値は [5 5] です。近傍のサイズを大きくすると、計算時間が長くなります。

各点の探索反復の最大数。整数として指定します。KLT アルゴリズムは、各点の新しい位置の反復探索を収束するまで実行します。通常、このアルゴリズムは 10 回以内の反復で収束します。このプロパティは、探索反復の数に制限を設定します。推奨値は 1050 です。

使用法

説明

[points,point_validity] = pointTracker(I) は、入力フレーム I 内の点を追跡します。

[points,point_validity,scores] = pointTracker(I) は各点の信頼度スコアも返します。

setPoints(pointTracker,points) は、追跡する点を設定します。この関数は、追跡する点について [x y] 座標の M 行 2 列の points 配列を設定します。追跡中に多くの点が失われ、これらの点を再検出する必要がある場合には、この関数を使用できます。

setPoints(pointTracker,points,point_validity) はさらに、点を有効または無効としてマークできます。長さ M の入力 logical ベクトル point_validity には、追跡される点の有効性に対応する true 値または false 値が含まれます。長さ M は、点の数に対応します。false 値は、追跡されない無効な点を示します。たとえば、この関数と関数 estgeotform2d を使用して、前のフレームと現在のフレームでの点の位置の変化を判定できます。外れ値は無効としてマークできます。

入力引数

すべて展開する

ビデオ フレーム。グレースケールまたはトゥルーカラー (RGB) として指定します。

出力引数

すべて展開する

追跡された点。入力フレーム I 内の点の新しい位置に対応する [x, y] 座標の M 行 2 列の配列として返されます。

各点に対する追跡の信頼性。M 行 1 列の logical 配列として返されます。いくつかの理由で点が無効になる場合があります。点がイメージの外側に位置する場合、その点は無効になることがあります。近傍で計算された空間勾配行列が特異である場合にも、その点は無効になることがあります。双方向の誤差が MaxBidirectionalError しきい値より大きい場合に、点が無効になることもあります。

01 の信頼度スコア。M 行 1 列の配列として返されます。値は、各点の前の位置と新しい位置の近傍の類似度に対応します。これらの値は、前の近傍と新しい近傍の距離の二乗和の関数として計算されます。追跡の信頼度の最大値は、完全一致スコアである 1 に対応します。

オブジェクト関数

オブジェクト関数を使用するには、System object™ を最初の入力引数として指定します。たとえば、obj という名前の System object のシステム リソースを解放するには、次の構文を使用します。

release(obj)

すべて展開する

initializeInitialize video frame and points to track
stepSystem object のアルゴリズムの実行
releaseリソースを解放し、System object のプロパティ値と入力特性の変更を可能にします。
resetSystem object の内部状態のリセット

すべて折りたたむ

ビデオの読み取りと表示およびオブジェクトの境界ボックスの描画を行う 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);

参照

[1] Lucas, Bruce D. and Takeo Kanade. “An Iterative Image Registration Technique with an Application to Stereo Vision,”Proceedings of the 7th International Joint Conference on Artificial Intelligence, April, 1981, pp. 674–679.

[2] Tomasi, Carlo and Takeo Kanade. Detection and Tracking of Point Features, Computer Science Department, Carnegie Mellon University, April, 1991.

[3] Shi, Jianbo and Carlo Tomasi. “Good Features to Track,” IEEE Conference on Computer Vision and Pattern Recognition, 1994, pp. 593–600.

[4] Kalal, Zdenek, Krystian Mikolajczyk, and Jiri Matas. “Forward-Backward Error: Automatic Detection of Tracking Failures,” Proceedings of the 20th International Conference on Pattern Recognition, 2010, pages 2756–2759, 2010.

拡張機能

バージョン履歴

R2012b で導入