1

Я работаю над следующим кодом.Как получить векторы скорости и величины поля оптического потока? Я использую метод оптического потока Lucas-Kande

n=0; 

folder = fileparts(which('viptraffic.avi')); 

movieFullFileName = fullfile(folder, 'viptraffic.avi'); 

vidReader = VideoReader(movieFullFileName); 

opticFlow = opticalFlowLK('NoiseThreshold',0.0039); 

while hasFrame(vidReader) 

    frameRGB = readFrame(vidReader); 

    frameGray = rgb2gray(frameRGB); 

    flow = estimateFlow(opticFlow,frameGray); 

    H=imag(flow) 

    V=real(flow) 

    frameWithFlow = getframe(gca); 

    imshow(frameRGB); 

    imshow(frameWithFlow.cdata) 

    hold on 

    plot(flow,'DecimationFactor',[5 5], 'ScaleFactor',10) 

    hold off 

    n=n+1; 

end 

Есть ли способ получить оценки оптического потока по скорости и величине для каждого поля оптического потока, полученного на каждом изображении?

ответ

3

estimateFlow возвращает объект opticalFlow, который обладает свойствами для величины, фазы и скорости. Итак, в вашем случае flow является объектом opticalFlow, а не сложным массивом, и вы не можете передать его real и imag. Вместо этого используйте свойства объекта:

flow.Vx   % x component of velocity 
flow.Vy   % y component of velocity 
flow.Orientation % Phase 
flow.Magnitude % Magnitude 
+0

Ну, с приведенным выше кодом он переписывает значение фазы и величины для каждого кадра. Чтобы этого избежать, я создал трехмерную матрицу как: - nArrays = Vid_dur * Vid_frate; % Vid_dur - продолжительность видео, а Vid_frate - частота кадров видео threeD_Ori = нули (Vid_height, Vid_width, nArrays, 'single'); % Vid_height и Vid_width - высота и ширина видеофрагментов. Теперь я храню данные в матрице как threeD_Ori (:,:, ii) = flow.Orientation; Но это приводит к ошибке неправильной матрицы. Как сохранить результат? –

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