オプティカルフローの例
必見 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");
startx xhost + ssh -X username@ipaddress
cd <ソースコードのファイルを置いたディレクトリ> source "<ソースコードのファイル名>"
元画像の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))]);