Main Content

opticalFlowLKDoG

Lucas-Kanade ガウス導関数法を使用してオプティカル フローを推定するためのオブジェクト

説明

Lucas-Kanade ガウス導関数 (DoG) 法を使用して、移動するオブジェクトの方向と速度を推定するためのオプティカル フロー オブジェクトを作成します。オブジェクト関数 estimateFlow を使用して、オプティカル フロー ベクトルを推定します。オブジェクト関数 reset を使用すると、オプティカル フロー オブジェクトの内部状態をリセットできます。

作成

説明

opticFlow = opticalFlowLKDoG は、ビデオ内の移動するオブジェクトの方向と速度の推定に使用できるオプティカル フロー オブジェクトを返します。オプティカル フローは、Lucas-Kanade ガウス導関数 (DoG) 法を使用して推定されます。

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

例: opticalFlowLKDoG('NumFrames',3)

プロパティ

すべて展開する

一時的な平滑化のためにバッファー済みのフレームの数。正の整数値スカラーとして指定します。この数値を大きくすると、オプティカル フロー推定法で、移動するオブジェクトの軌跡の急激な変化に対するロバスト性が低下します。フロー推定の遅延量は、NumFrames の値によって異なります。出力フローは tflow = tcurrent − 0.5(NumFrames-1) のイメージに対応します。ここで、tcurrent は現在のイメージの時刻です。

イメージ平滑化フィルターの標準偏差。正のスカラーとして指定します。

勾配平滑化フィルターの標準偏差。正のスカラーとして指定します。

ノイズ除去のしきい値。正のスカラーとして指定します。この数値を大きくすると、オブジェクトの動きがオプティカル フローの計算に与える影響が小さくなります。

オブジェクト関数

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

すべて折りたたむ

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

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

Lucas-Kanade DoG 法を使用してオプティカル フローを推定するオプティカル フロー オブジェクトを作成します。ノイズ除去のしきい値を指定します。出力は、オプティカル フロー推定法とそのプロパティを指定するオプティカル フロー オブジェクトです。

opticFlow = opticalFlowLKDoG('NoiseThreshold',0.0005)
opticFlow = 
  opticalFlowLKDoG with properties:

              NumFrames: 3
       ImageFilterSigma: 1.5000
    GradientFilterSigma: 1
         NoiseThreshold: 5.0000e-04

カスタム 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',35,'Parent',hPlot);
    hold off
    pause(10^-3)
end

{"String":"Figure contains an axes object and an object of type uipanel. The axes object contains 2 objects of type image, quiver.","Tex":[],"LaTex":[]}

{"String":"Figure contains an axes object and an object of type uipanel. The axes object contains 2 objects of type image, quiver.","Tex":[],"LaTex":[]}

アルゴリズム

すべて展開する

2 つのイメージ間のオプティカル フローを計算するには、次のオプティカル フロー拘束方程式を解かなければなりません。

Ixu+Iyv+It=0

  • IxIy および It は、時空間イメージの明るさの導関数です。

  • u は水平方向のオプティカル フローです。

  • v は垂直方向のオプティカル フローです。

参照

[1] Barron, J. L., D. J. Fleet, S. S. Beauchemin, and T. A. Burkitt. “ Performance of optical flow techniques.” In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR),236-242. Champaign, IL: CVPR, 1992.

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

バージョン履歴

R2015a で導入