How to obtain velocity and magnitude vectors of the optical flow field? I am using Lucas-Kande method of optical flow.

15 views (last 30 days)
I am working on the following code.
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
Is there a way to get the optical flow estimates of velocity and magnitude for every optical flow field obtained in every image?
  1 Comment
Nachiket Patki
Nachiket Patki on 5 May 2018
hey @ Daksh Agarwal I also tried this code can you please tell me one thing whether your output video runs very slowly? Because I am facing that problem. How can I make it faster?

Sign in to comment.

Answers (1)

Vishnu Sreekumar
Vishnu Sreekumar on 1 Mar 2017
If you're still looking for an answer:
x_vel = flow.Vx;
y_vel = flow.Vy;
magnitudes = flow.Magnitude;
orientations = flow.Orientation;
Note that if the image is n x m (n rows, m columns), X direction is top to bottom and Y direction is left to right when using imshow and
plot(flow,'DecimationFactor',[5 5], 'ScaleFactor',10)
is the same as
quiver(1:n,1:m,x_vel,y_vel);
  3 Comments
Vishnu Sreekumar
Vishnu Sreekumar on 18 Jun 2019
@Cheuk: No but I imagine it is pixels traveled per timeframe.
So if your magnitude is 0.4, and the distance between pixels is 1 cm (depending on your specific application), and the timestep between two frames is 0.1 s, then the speed is 0.4 x 1 cm / 0.1 s = 4 cm/s.

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!