Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

opticalFlowFarneback

Farneback 法を使用してオプティカル フローを推定するオブジェクト

説明

Farneback 法を使用して移動するオブジェクトの方向と速度を推定するオプティカル フロー オブジェクトを作成します。オブジェクト関数 estimateFlow を使用して、オプティカル フロー ベクトルを推定します。オブジェクト関数 reset を使用すると、オプティカル フロー オブジェクトの内部状態をリセットできます。

作成

説明

opticFlow = opticalFlowFarneback は、ビデオ内の移動するオブジェクトの方向と速度の推定に使用できるオプティカル フロー オブジェクトを返します。オプティカル フローは Farneback 法を使用して推定されます。

opticFlow = opticalFlowFarneback(Name,Value) は、Name,Value ペアの引数を 1 つ以上指定したプロパティを使用してオプティカル フロー オブジェクトを返します。指定していないプロパティはすべて既定値になります。各プロパティ名を引用符で囲みます。

たとえば、opticalFlowFarneback('NumPyramidLevels',3) です。

プロパティ

すべて展開する

ピラミッド層の数。正のスカラーとして指定します。値には層の 1 つとして初期イメージが含まれます。この値を 1 に設定すると、関数はオプティカル フローを元のイメージ フレームからのみ推定し、ピラミッド分解は実行しません。推奨値は 14 です。

イメージのスケール。(0,1) の範囲の正のスカラーとして指定します。この値によって、各ピラミッド レベルでのダウンサンプリングのレートが指定されます。値が 0.5 の場合、従来のピラミッドが作成されます。このピラミッドでは、各レベルでピラミッドの解像度が 2 分の 1 に低下します。ピラミッドの最も低いレベルが最も高い解像度をもちます。

ピラミッド レベルごとの探索反復回数。正の整数として指定します。Farneback アルゴリズムは、各ピラミッド レベルのキー ポイントの反復探索を収束するまで実行します。

ピクセル近傍のサイズ。正の整数として指定します。近傍のサイズを大きくすると動きがぼやけます。動作をぼかすことで、さらにロバストなオプティカル フロー推定が得られます。NeighborhoodSize の標準値は 5 または 7 です。

平均化フィルター サイズ。[2, Inf) の範囲の正の整数として指定します。アルゴリズムによる変位 (フロー) の計算後、サイズ (FilterSize * FilterSize) のガウス フィルターを使用して近傍の平均化が実行されます。さらに、境界に近いピクセルは、アルゴリズムでは多項式の展開係数は信頼性が低いと想定されているため、削減された重みが与えられます。フィルター サイズを大きくすると、イメージ ノイズに対するアルゴリズムのロバスト性が向上します。フィルター サイズが大きくなると、アルゴリズムはより大きなイメージ ノイズと高速動作検出を処理できるため、ロバスト性が向上します。

オブジェクト関数

estimateFlowオプティカル フローの推定
resetReset the internal state of the optical flow estimation object

すべて折りたたむ

ビデオ ファイルを読み取ります。読み取るフレームのタイムスタンプを指定します。

vidReader = VideoReader('visiontraffic.avi','CurrentTime',11);

Farneback 法を使用してオプティカル フローを推定するオプティカル フロー オブジェクトを作成します。出力はオブジェクトで、オプティカル フロー推定法とそのプロパティを指定します。

opticFlow = opticalFlowFarneback
opticFlow = 
  opticalFlowFarneback with properties:

    NumPyramidLevels: 3
        PyramidScale: 0.5000
       NumIterations: 3
    NeighborhoodSize: 5
          FilterSize: 15

カスタム Figure ウィンドウを作成して、オプティカル フロー ベクトルを可視化します。

h = figure;
movegui(h);
hViewPanel = uipanel(h,'Position',[0 0 1 1],'Title','Plot of Optical Flow Vectors');
hPlot = axes(hViewPanel);

イメージ フレームを読み取って、グレースケール イメージに変換します。連続するイメージ フレームからオプティカル フローを推定します。現在のイメージ フレームを表示して、オプティカル フロー ベクトルを Quiver プロットとしてプロットします。

while hasFrame(vidReader)
    frameRGB = readFrame(vidReader);
    frameGray = im2gray(frameRGB);  
    flow = estimateFlow(opticFlow,frameGray);
    
    imshow(frameRGB)
    hold on
    plot(flow,'DecimationFactor',[5 5],'ScaleFactor',2,'Parent',hPlot);
    hold off
    pause(10^-3)
end

Figure contains an axes object and an object of type uipanel. The axes object contains 2 objects of type image, quiver.

Figure contains an axes object and an object of type uipanel. The axes object contains 2 objects of type image, quiver.

アルゴリズム

Farneback アルゴリズムは、各レベルが前のレベルと比較して低い解像度をもつイメージ ピラミッドを生成します。1 より大きいピラミッド レベルを選択すると、アルゴリズムによって、最も低いレベルから始めて複数レベルの解像度で点を追跡できます。ピラミッド レベルの数を増やすと、アルゴリズムによってフレーム間でのより大きい点の変位に対処できます。ただし、計算数も増加します。次の図は、3 つのレベルをもつイメージのピラミッドを示しています。

追跡は最も低い解像度レベルから開始され、収束するまで継続します。あるレベルで検出された点の位置が、後続のレベルのキーポイントとして伝播されます。このようにして、アルゴリズムによって各レベルで追跡が調整されます。ピラミッド分解を使用すると、アルゴリズムによって、近傍のサイズより大きい距離になる可能性のあるピクセルの大きな動きに対処できます。

参照

[1] Farneback, G. “Two-Frame Motion Estimation Based on Polynomial Expansion.” In Proceedings of the 13th Scandinavian Conference on Image Analysis, 363 - 370. Halmstad, Sweden: SCIA, 2003.

拡張機能

バージョン履歴

R2015b で導入