Average Optical Flow vectors and plot over multiple frames

35 visualizaciones (últimos 30 días)
Alex M
Alex M el 19 de Abr. de 2021
Editada: Adam Danz el 28 de Abr. de 2021
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 comentarios
Adam Danz
Adam Danz el 19 de Abr. de 2021
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 el 21 de Abr. de 2021
thank you for your comment! You are right, I edited my initial post so I hope my question might be easier to understand now.

Iniciar sesión para comentar.

Respuesta aceptada

Adam Danz
Adam Danz el 21 de Abr. de 2021
Editada: Adam Danz el 22 de Abr. de 2021
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 comentarios
Alex M
Alex M el 28 de Abr. de 2021
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 el 28 de Abr. de 2021
Editada: Adam Danz el 28 de Abr. de 2021
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.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Computer Vision with Simulink en Help Center y File Exchange.

Productos


Versión

R2020b

Community Treasure Hunt

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

Start Hunting!

Translated by