Average Optical Flow vectors and plot over multiple frames

조회 수: 8 (최근 30일)
Alex M
Alex M 2021년 4월 19일
편집: Adam Danz 2021년 4월 28일
Hello,
I am trying to get the average optical flow vectors for a whole video (e.g. for a 10 second video). Currently I am using the opticalFlowFarneback method from Estimate optical flow example with the Computer Vision Toolbox (https://www.mathworks.com/help/vision/ref/opticalflowhs.estimateflow.html):
%% Estimating Optical Flow
% This example uses the Farneback Method to to estimate the direction and speed of moving
% cars in the video
% Copyright 2018 The MathWorks, Inc.
%% Read the video into MATLAB
vidReader = VideoReader('visiontraffic.avi');
opticFlow = opticalFlowFarneback;
%% Estimate Optical Flow of each frame
while hasFrame(vidReader)
frameRGB = readFrame(vidReader);
frameGray = rgb2gray(frameRGB);
flow = estimateFlow(opticFlow,frameGray);
imshow(frameRGB)
hold on
% Plot the flow vectors
plot(flow,'DecimationFactor',[25 25],'ScaleFactor', 2)
% Find the handle to the quiver object
q = findobj(gca,'type','Quiver');
% Change the color of the arrows to red
q.Color = 'r';
drawnow
hold off
end
Although this produces a nice visualization of flow vectors between two frames (see attached image), I need more like an average of flow vectors across all frames of the video. I am quite new to MatLab, I would be super thankful for any feedback how to change abovementioned code.
  댓글 수: 2
Adam Danz
Adam Danz 2021년 4월 19일
Your question is framed in such a way that only people familiar with the tutorial you mentioned can help.
If you can redefine the question more generally or provide a minimal working example, you might have a better chance of a bite.
Alex M
Alex M 2021년 4월 21일
thank you for your comment! You are right, I edited my initial post so I hope my question might be easier to understand now.

댓글을 달려면 로그인하십시오.

채택된 답변

Adam Danz
Adam Danz 2021년 4월 21일
편집: Adam Danz 2021년 4월 22일
Here's a demo that shows how to
  • Store the flow structure within a loop (assumes all flow arrays are the same size)
  • Average a variable in the flow structure across loop iterations.
% preallocate structure array
flow = opticalFlow;
% Create and store optic flow object within loop
for i = 1:10
Vx = randn(100,100);
Vy = randn(100,100);
flow(i) = opticalFlow(Vx,Vy);
end
% flow is a 1x10 structure array
% Concatenate Orientation along 3rd dimension
% flowOrientation is a 100x100x10 array for
% 100x100 flow vectors across 10 iterations.
flowOrientation = cat(3,flow.Orientation);
% Average Orientation values across loop iterations
% meanOrientation is 100x100 mean vectors
meanOrientation = mean(flowOrientation,3)
  댓글 수: 6
Alex M
Alex M 2021년 4월 28일
Thanks! I think that did the trick! The result after flipping the y-axis looks very reasonable to me. Although I was wondering why this was not issue with the example Optical Flow code in the original Post. Thank you very much for your support, it helped me a lot!
Adam Danz
Adam Danz 2021년 4월 28일
편집: Adam Danz 2021년 4월 28일
I see that you're using 2020b and that example in 2021a looks like it changed. I'd have to look at the documentation for 2020b which I don't have time to do right now but maybe I'll remember to look into it later.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Tracking and Motion Estimation에 대해 자세히 알아보기

제품


릴리스

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by