オプティカルフローの例
オプティカルフローの例
- オプティカルフロー (Octave bindings for OpenCV)を使用
前準備
Octave のインストール
その他
- Octave の video パッケージのビルドが済んでおり,ビルドで出来た oct ファイルが,Octave のパスが通ったディレクトリに格納されていること.
- Octave bindings for OpenCV のビルドとインストールが済んでいること.
必見 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");
実行方法と実行結果の例
- (オプション)Cygwin からリモートログインする場合
startx xhost + ssh -X username@ipaddress
- ソースコードをファイルとして保存
- Octave を起動
- Octave の source コマンドを使って実行
cd <ソースコードのファイルを置いたディレクトリ> source "<ソースコードのファイル名>"
- 実行が終わるまで数秒待つ
- 途中で何回か「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))]);