Отслеживание автомобилей с помощью Optical Flow. Почему векторы не отображаются правильно?

Я новичок в оптическом потоке и компьютерном зрении в целом, и я начал работать с простым демо-примером из Matlab.

Цель этого состоит в том, чтобы использовать видео и отображать векторы движения на экране. Я использую следующий код:

%% initialization
close all
clear all

% Create reader

reader = vision.VideoFileReader;
reader.Filename = 'viptraffic.avi';

   % Create viewer
   viewer = vision.DeployableVideoPlayer;
   %%viewer.FrameRate = 10;

%Create Optical Flow
optical = vision.OpticalFlow; %how pixels are moving from one frame to the next
optical.OutputValue = 'Horizontal and vertical components in complex form'; %will allow         us to draw a vector
%%%on the vision so that we see how the pixels are moving from one frame to the next

%%We pass the horizontal and vertical components to the shape inserter
%%below

% Display vector fields
shapes = vision.ShapeInserter;
shapes.Shape = 'Lines';
shapes.BorderColor = 'white';

R = 1:4:120;%%downsample the optical flow field
C = 1:4:160;%%downsample the optical flow field

[Cv, Rv] = meshgrid (C, R); %%% display a grid on the image and take every fourth value


Rv = Rv(:)';
Cv = Cv(:)';

 %% Execution
 reset(reader)

 %Set up for stream
 while ~isDone(reader)

 I = step(reader);
 of = step(optical,rgb2gray(I));
 size(of)

 ofd = of(R,C);
 size(ofd)


 H = imag(ofd)*20;
 V = real(ofd)*20;


 %Draw lines on top of image
 lines = [Rv;Cv; Rv+H(:)'; Cv+V(:)']; %%start and a finish , start+movement,   end+movement
 % lines = [Cv;Rv;Cv;Rv];
 Ishp = step(shapes,I,lines);

 step(viewer,Ishp);

 end
 release(viewer);

Я не понимаю, почему векторные линии не отображаются должным образом.

Может кто-нибудь помочь мне?

Спасибо

PS: вот результат: введите здесь описание изображения


person Ali P    schedule 01.07.2014    source источник
comment
Что вы получаете. Вы можете показать нам?   -  person Ander Biguri    schedule 02.07.2014


Ответы (1)


Попробуйте использовать

lines = [Rv(:); Cv(:); Rv(:)+H(:); Cv(:)+V(:)];

вместо

lines = [Rv;Cv; Rv+H(:)'; Cv+V(:)'];

Еще лучше, если у вас последняя версия Matlab, попробуйте использовать функцию insertShape вместо vision.ShapeInserter.

Изменить. Если у вас установлена ​​последняя версия Computer Vision System Toolbox, попробуйте новые функции оптического потока: opticalFlowHS, opticalFlowLK, opticalFlowLKDoG и opticalFlowFarneback.

person Dima    schedule 02.07.2014
comment
Спасибо; но это, похоже, не исправить. Любые другие предложения? - person Ali P; 03.07.2014
comment
Попробуйте нарисовать один вектор. Убедитесь, что линия представлена ​​правильно. - person Dima; 04.07.2014