Average Optical Flow vectors and plot over multiple frames

8 次查看(过去 30 天)
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