Main Content

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

2 つのイメージ間の動きの推定

この例は、Block Matching ブロックを使用して、2 つのイメージ間の動きを推定する方法を示しています。

動きを推定する必要のあるイメージ フレームを読み取ります。

I1 = imread('car_frame1.png');
I2 = imread('car_frame2.png');

モデル例

MATLAB コマンド プロンプトで関数 open を呼び出してモデルを開きます。Simulink ファイルの名前を指定して開きます。

open_system('ex_blockmatching.slx');

Image From Workspace ブロックを使用して、モデル ワークスペースにイメージを読み込みます。ファイルの場所からイメージを直接読み取るには、代わりに Image From File ブロックを使用します。モデルは、異なる時間間隔で取得された移動中の自動車の 2 つの RGB イメージ間の動きを推定します。モデルは、動き推定に 3 ステップのブロック マッチング アルゴリズムを使用します。オーバーラップしないマクロ ブロックを照合するためのコスト関数は、平均二乗誤差 (MSE) に設定されます。マクロ ブロックのサイズは 35 x 35 に設定され、一致するブロックに許可される最大変位 (水平および垂直方向) は 7 ピクセルに設定されます。Block Matching ブロックから出力される速度は、複雑な形式の動きベクトルの水平成分と垂直成分の両方で構成されます。

Compositing ブロックを使用して、両方のイメージを重ね合わせることができます。

モデルの実行

モデルをシミュレートし、モデルの出力を MATLAB ワークスペースに保存します。モデルは、動きベクトルと重ね合わせたイメージを出力します。

out = sim('ex_blockmatching.slx');

結果の表示

出力の動きベクトルと重ね合わせたイメージを読み取ります。

vx = real(out.simout.Data);
vy = imag(out.simout.Data);
imageOverlay = out.simout1.Data;

マクロ ブロックのサイズを基準にして、イメージの平面上の点を指定します。

x = 1:35:size(imageOverlay,1);
y = 1:35:size(imageOverlay,2);

重ね合わせたイメージを表示し、関数 quiver を使用して動きベクトルの水平成分と垂直成分をプロットします。

figure,imshow(imageOverlay);
hold on
quiver(y',x,vx,vy,0);