How can I track and measure the velocity of a moving object in a video?

20 ビュー (過去 30 日間)
Ty Grupel
Ty Grupel 2017 年 1 月 24 日
コメント済み: Dalia 2023 年 9 月 12 日
The video itself is quite simple. It's a high contrast capture of a droplet moving across the screen. How can I calculate the velocity of the droplet given that I already have the scale (pixels to mm)? Any input/direction would be appreciated.
  1 件のコメント
Jorge Mario Guerra González
Jorge Mario Guerra González 2017 年 1 月 24 日
I imagine you have a plain screen with a particle moving around, I would use the plain colour as a mask, then try to substract frame1-frame2, the number of pixels with X difference It's the movement.
But that's just an idea...

サインインしてコメントする。

採用された回答

Tohru Kikawada
Tohru Kikawada 2017 年 1 月 24 日
You can easily calculate the velocity multiplying the distance of centroids between previous frame and current frame, the frame rate of the video and the scale of the unit is meter/pixel.
scale = 1/320; % meter/pixel
frameRate = 30; % frame/second
velocity = velociy_pix * frameRate * scale; % pixel/frame * frame/second * meter/pixel
Here is an example code that calculates the velocity of a moving ball (requires Computer Vision System Toolbox):
%%Create a video for detection
writerObj = VideoWriter('movingBall.avi');
open(writerObj);
bgI = zeros(240,320,'uint8');
pos_org = [160 120];
r = 10;
for k = 1: 300
f = 0.2*(1-exp(-k/200));
pos = pos_org + 50*[cos(2*pi*f/30*k) sin(2*pi*f/30*k)];
I = insertShape(bgI, 'FilledCircle', [pos r], 'Color', 'white');
I = I + uint8(randn(size(I)))*10;
writeVideo(writerObj,im2frame(I));
end
close(writerObj);
%%Calculate velocity of the ball
videoFileReader = vision.VideoFileReader('movingBall.avi');
S = info(videoFileReader);
frameRate = S.VideoFrameRate; % frame/second
scale = 1/320; % m/pixel
videoPlayer = vision.VideoPlayer('Position',[100 100 600 400]);
oldPoints = [];
while ~isDone(videoFileReader)
videoFrame = step(videoFileReader);
G = rgb2gray(videoFrame);
BW = G > 0.5;
BW2 = bwareaopen(BW, 30);
BW3 = imfill(BW2, 'holes');
stats = regionprops('table',BW3,'Centroid');
points = table2array(stats);
if ~isempty(oldPoints)
% Calculate velocity (pixels/frame)
vel_pix = sqrt(sum((points-oldPoints).^2,2));
vel = vel_pix * frameRate * scale; % pixels/frame * frame/seconds * meter/pixels
else
vel_pix = 0;
vel = 0;
end
% Visualize the velocity
videoFrameOut = insertObjectAnnotation(videoFrame, 'circle', ...
[points 10*ones(size(points,1),1)], ...
cellstr(num2str(vel,'%2.2f')));
step(videoPlayer, videoFrameOut);
oldPoints = points;
end
release(videoFileReader);
release(videoPlayer);
  10 件のコメント
muhammad choudhry
muhammad choudhry 2020 年 8 月 13 日
Hi,
I am using this code on the particle tracking video and getting this error. Can you help?
Error:
Matrix dimensions must agree.
Error in velocity (line 39)
vel_pix = sqrt(sum((points-oldPoints).^2,2));
Dalia
Dalia 2023 年 9 月 12 日
How can I estimate the velocity of water in a channel, the flow is turbulent ? I want to track a specific point and estimate its velocity but I cant write the code to specify this point as interset point.
Can you help?

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeTracking and Motion Estimation についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by