2016-06-18 3 views
0

В настоящее время я пытаюсь реализовать HS-метод для оптического потока, но мои u и v всегда кажутся только нулями в них. Я не могу показаться, чтобы выяснить мою ошибку здесь:Оптический поток Хорн-Шунка (скорость усреднения)

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

ответ

0

Я нашел это paper с некоторыми дополнительными пояснениями, а также некоторым кодом matlab.

Они вычисляют среднее значение и и г следующим образом:

% 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 

 Смежные вопросы

  • Нет связанных вопросов^_^