MATLAB Answers

Speed up image processing and for-loop iterations for faster centroid tracking

24 views (last 30 days)
Scott Kaiser
Scott Kaiser on 8 Jul 2020
Edited: Scott Kaiser on 16 Jul 2020 at 19:43
Hello! I have some code that is working quite well to find the centroid of an object in my live video stream(via winvideo) that is a "hunter orange" color. The code records in a 1x2 array the coordinates of the centroid every for-loop iteration. Timing this process takes between 1.0-1.5 seconds, on average, per loop. Meaning I only get new centroid coords every 1.5 seconds. I would like to speed this up but I am unsure of how to go about this. Note that the color filter code was obtained from the colorthresholder app where I used the HSV colorspace and simply exported the code. Shown below is my main function which calls this code. Any suggestions for speeding up this code would be much appreciated! Thanks for all the help!
%% Main function to run HunterOrangeMask
clear; close all; clc; imaqreset;
% Create video input object.
vid= videoinput('winvideo',1,'YUY2_640x640');
set(vid,'ReturnedColorSpace', 'RGB') %Needed this to convert YUY2 to RBG to get rid of pink coloring
frames=2000;
for i=1:frames
%Acquire an image form the webcam
img=getsnapshot(vid);
%This is the function that I exported from the colorThresholder app for filtering
[BW]=HunterOrangeMask(img);
% Find spot in the filtered image with largest blob area.
largestBlob = bwareafilt(BW, 1);
%find the centre of blob
s = regionprops(largestBlob, 'centroid');
%1x2 Array with x-y coords of centroid
centroids=cat(1, s.Centroid)
end
stop(vid)
delete(vid);

  1 Comment

Bjorn Gustavsson
Bjorn Gustavsson on 9 Jul 2020 at 6:47
Use the matlab profiler to record where your algorithm spends its time. Then you can start to hunt bottlenecks.
The code you shown above is a very neat-looking code - but also impossible to gain any relevant information from to address your question.

Sign in to comment.

Answers (1)

Image Analyst
Image Analyst on 9 Jul 2020 at 13:21
Edited: Image Analyst on 9 Jul 2020 at 13:24
You could try to do it in RGB colorspace. That would be faster, though perhaps not as precise, however if it's a quite distinct color with no others like it, then it should work.
See attached demo for my demo of HSV tracking in a video. But like I said, you could just do it in RGB color space and then you wouldn't be doing tons of time consuming math.
And perhaps just reuse BW instead of creating a new variable largestBlob.

  1 Comment

Scott Kaiser
Scott Kaiser on 14 Jul 2020 at 18:51
Thank you for the suggestions. I reused the variable BW as suggested and I tried working in RGB colorspace with no noticable improvement in speed. I did more digging and found some code that worked quite well. Rather than looping every 1.5 seconds I now am able to process about 20-30 fps! See my new code below. Again, thank you for all your suggestions.
clear;clc
cam = imaq.VideoDevice('winvideo',1,'YUY2_640x640','ReturnedColorSpace', 'RGB');
I = step(cam);
h = imagesc(I);
set(h, 'EraseMode', 'none');
frames=1000;
for i=1:frames
%Acquire an image form the webcam
img = step(cam);
%% Send unfiltered image "img" to function creakmask(RGB) to filter out all colors except hunter orange
[BW]=HunterOrangeMask(img);
%% Find area in filtered image with largest blob area. Works only for BW image.
BW= bwareafilt(BW, 1);
%% Show and get coordinates of largestBlob's Centroid.
s = regionprops(BW, 'centroid');
centroids=cat(1, s.Centroid);
%Update image in figure
set(h, 'CData', img);
%Plot centroids ontop of img
hold on
plot(centroids(1,1), centroids(1,2),'wo','Markersize',8);
hold off
end
delete(cam);

Sign in to comment.