オプティカルフローの例
オプティカルフローの例
- オプティカルフロー (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))]);
