2016-06-18 3 views
0

현재 광학 흐름에 대한 HS 방법을 구현하려고하지만 내 uv 항상 항상 0이있는 것 같습니다. 나는 여기에 내 오류를 알아낼 수 없습니다혼 - Schunck 광학 흐름 (평균 속도)

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'); 

항상 않을 것 단지 0을 갖는 회선 행렬을 얻는다. 즉 될 경우

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

나는 더 많은 설명과 함께 일부 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