読者です 読者をやめる 読者になる 読者になる

粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

LucasKanade オプティカルフロー検出 @ MATLAB

メモ メモ-MATLAB メモ-コンピュータビジョン

この記事はメモです。
中のコードは以下のものをほとんど流用したので私のとは言い張りません。
https://jp.mathworks.com/matlabcentral/fileexchange/48744-lucas-kanade-tutorial-example-1/content/LucasKanadeExample1/html/LKExample1.html

関数名:OpticalFlow
入力:前画像,後画像
出力:前画像から後画像へのオプティカルフローを図としてアウトプット

参照元からの変更分

  • 関数への変更
  • Conv()からfilter2()関数の使用への変更

コード

%% Optical Flow
% This is not my original code
% https://jp.mathworks.com/matlabcentral/fileexchange/48744-lucas-kanade-tutorial-example-1/content/LucasKanadeExample1/html/LKExample1.html
% reviced conv() use to filter2

function OpticalFlow(img1,img2)

im1t = im2double(img1);
im1 = imresize(im1t, 0.5);
im2t = im2double(img2);
im2 = imresize(im2t, 0.5);

ww = 45;
w = round(ww/2);

% Lucas Kanade Here
% for each point, calculate I_x, I_y, I_t
fx=[-1,0,1;-1,0,1;-1,0,1];			% フィルタ行列の作成
fy = [-1,-1,-1;0,0,0;1,1,1];
Ix_m=filter2(fx,im1,'same');		% フィルタリングX方向微分
Iy_m=filter2(fy,im1,'same');		% フィルタリングY方向微分
It_m = im2 - im1;

% Ix_m = conv2(im1,[-1 1; -1 1], 'valid'); % partial on x
% Iy_m = conv2(im1, [-1 -1; 1 1], 'valid'); % partial on y
% It_m = conv2(im1, ones(2), 'valid') + conv2(im2, -ones(2), 'valid'); % partial on t
u = zeros(size(im1));
v = zeros(size(im2));

% within window ww * ww
for i = w+1:size(Ix_m,1)-w
   for j = w+1:size(Ix_m,2)-w
      Ix = Ix_m(i-w:i+w, j-w:j+w);
      Iy = Iy_m(i-w:i+w, j-w:j+w);
      It = It_m(i-w:i+w, j-w:j+w);

      Ix = Ix(:);
      Iy = Iy(:);
      b = -It(:); % get b here

      A = [Ix Iy]; % get A here
      nu = pinv(A)*b; % get velocity here

      u(i,j)=nu(1);
      v(i,j)=nu(2);
   end;
end;

% downsize u and v
u_deci = u(1:10:end, 1:10:end);
v_deci = v(1:10:end, 1:10:end);
% get coordinate for u and v in the original frame
[m, n] = size(im1t);
[X,Y] = meshgrid(1:n, 1:m);
X_deci = X(1:20:end, 1:20:end);
Y_deci = Y(1:20:end, 1:20:end);
figure();
imshow(img2);
hold on;
% draw the velocity vectors
quiver(X_deci, Y_deci, u_deci,v_deci, 'y')

end

入力と出力結果

左2つが入力で出力が右のようになります。
f:id:ossyaritoori:20161007224346p:plain