トップページ -> 実践知識 -> Octave を用いた画像処理,信号処理 -> オプティカルフローの例
[サイトマップへ], サイト内検索:

オプティカルフローの例

サイト構成 連絡先,業績など 実践知識 データの扱い コンピュータ 教材 サポートページ

オプティカルフローの例


前準備

必見 Web ページ: http://www.csse.uwa.edu.au/~pk/Research/MatlabFns/

必見 Web ページ: http://www.eecs.berkeley.edu/Research/Projects/CS/vision/bsds/

※ Octave のプロンプトを変えたいときは,次のように操作する.

PS1('> ')

※ Octave のインストールによっては,Octave の起動時に毎回次の操作を行う必要があるかもしれない

pkg load image


プログラムのソースコード(書きかけ)
function mat = cvreal2d_to_mat(cv)
# Read2D 型を要素とする配列(OpenCV のデータ)cv を,Octave の2次元配列 mat にコピー
for x = [1:cv.width]
  for y = [1:cv.height]
    mat(y,x) = cvGetReal2D(cv, y-1, x-1);
  end
end
endfunction

function cv = mat_to_cvreal2d(mat)
# Octave の2次元配列 mat を,Read2D 型を要素とする配列(OpenCV のデータ)cv にコピー
height = size(mat)(1);
width = size(mat)(2);
for x = [1:width]
  for y = [1:height]
    cvSetReal2D(cv, y-1, x-1, mat(y,x));
  end
end
endfunction

# モーションベクターの例
# 画像読み込み時に「CV_LOAD_IMAGE_GRAYSCALE」を指定しているので,自動的に濃淡画像に変換される

# read and convert to grayscale image
Lagrangian_multiplier = 64;
maximum_iteration = 100;
epsilon = 0.02;
img1 = cvLoadImage("20090701001_avi01_001000.png", CV_LOAD_IMAGE_GRAYSCALE);
img2 = cvLoadImage("20090701001_avi01_001002.png", CV_LOAD_IMAGE_GRAYSCALE);
# CV_32FC1 を要素とする行列
vx = cvCreateMat(img1.height, img1.width, CV_32FC1);
# CV_32FC1 を要素とする行列
vy = cvCreateMat(img1.height, img1.width, CV_32FC1);
cvSetZero(vx);
cvSetZero(vy);
criteria = cvTermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, maximum_iteration, epsilon );
cvCalcOpticalFlowHS( img1, img2, 0, vx, vy, Lagrangian_multiplier, criteria );
# cvCalcOpticalFlowLK( img1, img2, cvSize(1,1), vx, vy );



# image copy
img1mat = cvreal2d_to_mat(img1);
colormap(gray(256));
imshow(img1mat, [min(min(img1mat)) max(max(img1mat))]);
input("Please press enter to continue");

img2mat = cvreal2d_to_mat(img2);
colormap(gray(256));
imshow(img2mat, [min(min(img2mat)) max(max(img2mat))]);
input("Please press enter to continue");

# vx, vy copy
vxmat = cvreal2d_to_mat(vx);
vymat = cvreal2d_to_mat(vy);

p = max(-16, min(16, abs(vxmat) + abs(vymat)));
colormap(gray(256));
imshow(p, [min(min(p)) max(max(p))]);
input("Please press enter to continue");

mask = ( abs(vxmat) + abs(vymat) ) > 1;
a = atan2(vymat, vxmat) .* mask;

colormap( rainbow(256) );
imshow(a, [min(min(a)) max(max(a))]);
input("Please press enter to continue");

実行方法と実行結果の例

  1. (オプション)Cygwin からリモートログインする場合
    startx
    xhost +
    ssh -X username@ipaddress
    

  2. ソースコードをファイルとして保存

  3. Octave を起動

  4. Octave の source コマンドを使って実行
    cd <ソースコードのファイルを置いたディレクトリ>
    source "<ソースコードのファイル名>"
    

  5. 実行が終わるまで数秒待つ

  6. 途中で何回か「please press Enter to proceed」と表示されるので,Enter キーを押す.

元画像の1

元画像の2

求まった動きベクトル(x,y) について abs(x) + abs(y) を表示

求まった動きベクトル(x,y) について atan2(y,x) を表示

さらに・・・

d = img1mat - img2mat
imshow(d, [-255 255]);

imshow(abs(d) > 8, [0 1]);

imshow( bwmorph( bwmorph( abs(d) > 8, "dilate", 2), "erode", 2), [0 1]);

m = bwmorph( bwmorph( abs(d) > 8, "dilate", 2), "erode", 2);
pp = p .* m;
imshow(pp, [min(min(pp)) max(max(pp))]);


実習用の画像ファイル

サムネイル画像をクリックして,画像ファイルをダウンロードしてください. (一見同じ画像に見えますが,ビデオファイルの中の違うフレームです)