LK光流算法的matlab仿真与仿真

1.问题描述:

        空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。也就是说,由空间域到图像平面的投影。而通俗来讲,把图像中的每一个点的瞬时速度和方向找出来就是光流。然后使用最小二乘法对邻域中的所有像素点求解基本的光流方程。因为方程个数已经超过了为未知量个数假定像素位置p周围的领域像素由;将其写为矩阵的形式,则有

这里写图片描述

2.部分程序:

 

function [u,v]=LucaKanade(im1,im2)
numLevels=3;
window=9;
iterations=1;
alpha = 0.001;

hw = floor(window/2);
pyramid1=im1;
pyramid2=im2;
for i=2:numLevels
    im1 = impyramid(im1, 'reduce');
    im2 = impyramid(im2, 'reduce');
    pyramid1(1:size(im1,1), 1:size(im1,2), i) = im1;
    pyramid2(1:size(im2,1), 1:size(im2,2), i) = im2;
end;
for p = 1:numLevels
   
    im1 = pyramid1(1:(size(pyramid1,1)/(2^(numLevels - p))), 1:(size(pyramid1,2)/(2^(numLevels - p))), (numLevels - p)+1);
    im2 = pyramid2(1:(size(pyramid2,1)/(2^(numLevels - p))), 1:(size(pyramid2,2)/(2^(numLevels - p))), (numLevels - p)+1);
       
    if p==1
    u=zeros(size(im1));
    v=zeros(size(im1));
    else  
    u = 2 * imresize(u,size(u)*2,'bilinear');   
    v = 2 * imresize(v,size(v)*2,'bilinear');
    end
    
    for r = 1:iterations
   
    u=round(u);
    v=round(v);
    
        for i = 1+hw:size(im1,1)-hw
            for j = 1+hw:size(im2,2)-hw
            patch1 = im1(i-hw:i+hw, j-hw:j+hw);
      
            lr = i-hw+v(i,j);
            hr = i+hw+v(i,j);
            lc = j-hw+u(i,j);
            hc = j+hw+u(i,j);
           
                  if (lr < 1)||(hr > size(im1,1))||(lc < 1)||(hc > size(im1,2))  
                  else
                  patch2 = im2(lr:hr, lc:hc);
      
                  fx = conv2(patch1, 0.25* [-1 1; -1 1],'same') + conv2(patch2, 0.25*[-1 1; -1 1],'same');
                  fy = conv2(patch1, 0.25* [-1 -1; 1 1],'same') + conv2(patch2, 0.25*[-1 -1; 1 1],'same');
                  ft = conv2(patch1, 0.25*ones(2),'same') + conv2(patch2, -0.25*ones(2),'same');

      
                  Fx = fx(2:window-1,2:window-1)';
                  Fy = fy(2:window-1,2:window-1)';
                  Ft = ft(2:window-1,2:window-1)';

                  A = [Fx(:) Fy(:)];      
                  G=A'*A;
              
                  G(1,1)=G(1,1)+alpha; G(2,2)=G(2,2)+alpha;
                  U=1/(G(1,1)*G(2,2)-G(1,2)*G(2,1))*[G(2,2) -G(1,2);-G(2,1) G(1,1)]*A'*-Ft(:);
                  u(i,j)=u(i,j)+U(1); v(i,j)=v(i,j)+U(2);
                  end
            end
        end
    end
end
end
 

3.仿真结论:

C-79

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/115019714