Horn-Schunck光流(平均速度)

时间:2016-06-18 15:58:29

标签: matlab convolution opticalflow

我目前正在尝试为光流实施HS方法,但我的uv似乎总是只有零。我似乎无法在这里弄清楚我的错误:

vid=VideoReader('outback.AVI');
vid.CurrentTime = 1.5;

alpha=1;
iterations=10;    

frame_one = readFrame(vid);
vid.CurrentTime = 1.6;
frame_two = readFrame(vid);

% convert to grayscale

fone_gr = rgb2gray(frame_one);
ftwo_gr = rgb2gray(frame_two);

% construct  for each image
sobelx=[-1 -2 -1; 0 0 0; 1 2 1];
sobely=sobelx';
time=[-1 1];

fx_fone=imfilter(fone_gr, sobelx);
fy_fone=imfilter(fone_gr, sobely);
ft_fone=imfilter(fone_gr, time);

fx_ftwo=imfilter(ftwo_gr, sobelx);
fy_ftwo=imfilter(ftwo_gr, sobely);
ft_ftwo=imfilter(ftwo_gr, time);

Ix=double(fx_fone+fx_ftwo);
Iy=double(fy_fone+fy_ftwo);
It=double(ft_fone+ft_ftwo);

% flow-variables (velocity = 0 assumption)
velocity_kernel=[0 1 0; 1 0 1; 0 1 0];

u = double(0);
v = double(0);

% iteratively solve for u and v
for i=1:iterations
    neighborhood_average_u=conv2(u, velocity_kernel, 'same');
    neighborhood_average_v=conv2(v, velocity_kernel, 'same');

    data_term = (Ix .* neighborhood_average_u + Iy .* neighborhood_average_v + It);
    smoothness_term = alpha^2 + (Ix).^2 + (Iy).^2;

    numerator_u = Ix .* data_term;
    numerator_v = Iy .* data_term;

    u = neighborhood_average_u - ( numerator_u ./ smoothness_term );
    v = neighborhood_average_v - ( numerator_v ./ smoothness_term );
end

u(isnan(u))=0;
v(isnan(v))=0;

figure
imshow(frame_one); hold on;
quiver(u, v, 5, 'color', 'b', 'linewidth', 2);
set(gca, 'YDir', 'reverse');

我唯一不确定的是计算邻域平均值:

velocity_kernel=[0 1 0; 1 0 1; 0 1 0];

u = double(0);
v = double(0);

[..]
neighborhood_average_u=conv2(u, velocity_kernel, 'same');
neighborhood_average_v=conv2(v, velocity_kernel, 'same');

这不会总是导致只有零的卷积矩阵吗?

我考虑将其更改为以下内容,因为我需要在图像的每个像素上使用速度内核计算平均速度:

velocity_kernel=[0 1 0; 1 0 1; 0 1 0];
u = double(0);
v = double(0);

[..]
neighborhood_average_u=conv2(Ix, velocity_kernel, 'same');
neighborhood_average_v=conv2(Iy, velocity_kernel, 'same');

但我仍然不知道这是否是正确的方法。我按照MATLAB页面底部的说明操作: http://de.mathworks.com/help/vision/ref/opticalflowhs-class.html

1 个答案:

答案 0 :(得分:0)

我发现这个paper有一些进一步的解释,还有一些matlab代码。

他们按如下方式计算u和v的平均值:

% initial values 
u = 0; v = 0;

% weighted average kernel 
kernel = [1/12 1/6 1/12; 1/6 0 1/6; 1/12 1/6 1/12];

for i = 1:iterations
  uAvg = conv2( u, kernel 'same' );
  vAvg = conv2( v, kernel 'same' );
  ...
end