⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lucaskanaderefined.m

📁 matlab实现的lucas-kanade光流迭代算法
💻 M
字号:
function [u,v,cert] = LucasKanadeRefined(uIn, vIn, im1, im2);% Lucas Kanade Refined computes lucas kanade flow at the current level given previous estimates!%current implementation is only for a 3x3 window%[fx, fy, ft] = ComputeDerivatives(im1, im2);uIn = round(uIn);vIn = round(vIn);%uIn = uIn(2:size(uIn,1), 2:size(uIn, 2)-1);%vIn = vIn(2:size(vIn,1), 2:size(vIn, 2)-1);u = zeros(size(im1));v = zeros(size(im2));%to compute derivatives, use a 5x5 block... the resulting derivative will be 5x5...% take the middle 3x3 block as derivativefor i = 3:size(im1,1)-2   for j = 3:size(im2,2)-2    %  if uIn(i,j)~=0    %     disp('ha');    %  end;            curIm1 = im1(i-2:i+2, j-2:j+2);      lowRindex = i-2+vIn(i,j);      highRindex = i+2+vIn(i,j);      lowCindex = j-2+uIn(i,j);      highCindex = j+2+uIn(i,j);            if (lowRindex < 1)          lowRindex = 1;         highRindex = 5;      end;            if (highRindex > size(im1,1))         lowRindex = size(im1,1)-4;         highRindex = size(im1,1);      end;            if (lowCindex < 1)          lowCindex = 1;         highCindex = 5;      end;            if (highCindex > size(im1,2))         lowCindex = size(im1,2)-4;         highCindex = size(im1,2);      end;            if isnan(lowRindex)         lowRindex = i-2;         highRindex = i+2;      end;            if isnan(lowCindex)         lowCindex = j-2;         highCindex = j+2;      end;                  curIm2 = im2(lowRindex:highRindex, lowCindex:highCindex);            [curFx, curFy, curFt]=ComputeDerivatives(curIm1, curIm2);      curFx = curFx(2:4, 2:4);      curFy = curFy(2:4, 2:4);      curFt = curFt(2:4, 2:4);            curFx = curFx';      curFy = curFy';      curFt = curFt';      curFx = curFx(:);      curFy = curFy(:);      curFt = -curFt(:);            A = [curFx curFy];            U = pinv(A'*A)*A'*curFt;            u(i,j)=U(1);      v(i,j)=U(2);            cert(i,j) = rcond(A'*A);         end;end;u = u+uIn;v = v+vIn;


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [fx, fy, ft] = ComputeDerivatives(im1, im2);
%ComputeDerivatives	Compute horizontal, vertical and time derivative
%							between two gray-level images.

if (size(im1,1) ~= size(im2,1)) | (size(im1,2) ~= size(im2,2))
   error('input images are not the same size');
end;

if (size(im1,3)~=1) | (size(im2,3)~=1)
   error('method only works for gray-level images');
end;


fx = conv2(im1,0.25* [-1 1; -1 1]) + conv2(im2, 0.25*[-1 1; -1 1]);
fy = conv2(im1, 0.25*[-1 -1; 1 1]) + conv2(im2, 0.25*[-1 -1; 1 1]);
ft = conv2(im1, 0.25*ones(2)) + conv2(im2, -0.25*ones(2));
% make same size as input
fx=fx(1:size(fx,1)-1, 1:size(fx,2)-1);fy=fy(1:size(fy,1)-1, 1:size(fy,2)-1);ft=ft(1:size(ft,1)-1, 1:size(ft,2)-1);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -