I'm working on a project where I'm supposed to write a program that tracks an object in a video. The program is going to be written in Matlab.
The problem I have is that I can't figure out a way to give the function vision.MarkerInseter the location coordinates for the object in the video.
When I run my code I get an error message saying
Error using MarkerInserter/step
The Points input must be an M-by-2 matrix. Each row specifies a different center and is of the form [x y].
Error in Tracking_object_in_video (line 69)
tracking_on_frame = step(tracking_shape, frame, tracking_box);
When I check the dimension of tracking_box it says that is is a 13x1 matrix. The first number varies depending on the input video i use. But it is always x1.
Here is the code I have written so far.
Please help me, I'm really stuck!
fore_ground_detector = vision.ForegroundDetector('NumTrainingFrames',24,'InitialVariance',0.05);
blob_analyzer = vision.BlobAnalysis('AreaOutputPort',true,'MinimumBlobArea',20,'CentroidOutputPort',true,'ExcludeBorderBlobs',true);
%% Kod för videospelarna som ska användas att visa trackingen på.
tracking_player = vision.DeployableVideoPlayer('Location',[200 200]);
fore_ground_player = vision.DeployableVideoPlayer('Location',[600 200]);
tracking_shape = vision.MarkerInserter('Size', 18, 'Shape', 'square', 'Fill', 0.3, 'FillColor', 'White', 'Opacity', 0.5);
%% Stycke för att spela upp video samt spåra objecten.
while ~isDone(video)
frame = step(video); % Tar ut en frame i videon åt gången.
gray_frame = rgb2gray(frame); % Gör om den framen till gråskala.
masking = step(fore_ground_detector, gray_frame); % Letar rätt på områden som skiljer sig från bakgrunden.
noise_reduction = bwareaopen(masking,25); % Ignorera områden som består av mindre än X antal ihopkopplade pixlar
tracking_box = step(blob_analyzer, noise_reduction); % Bestämmer områden som är av intresse.
[~,detection] = step(blob_analyzer, noise_reduction); % Variable som visar om programmet hittar något objekt eller inte.
if ~isempty (detection) % Om detection INTE är tom.
tracking_on_frame = step(tracking_shape, frame, tracking_box); % Bestämmer var på skärmen som tracking boxen ska vara.
step(tracking_player, tracking_on_frame); % Sätter ihop tracking boxen och framen som vi har analyserat.
else % Om detection ÄR tom.
step(tracking_player,frame); % Visar bara upp framen som vi har analyserat utan tracking_box.
end
step(fore_ground_player, masking); % Spelar upp filmen som blob_analyzern ser den.
end
delete(tracking_player);
delete(fore_ground_player);
In your code, tracking_box output from blob_analyzer actually contains area of the blobs. When creating vision.BlobAnalysis you have enabled area output port in addition to centroid output. You seem to want only centroid output if you want to mark your objects. So you should only set CentroidOutputPort to true and AreaOutputPort to false. If you want both, you should assign both output as shown below and use centroid output as input to your marker inserter object.
[areas, centroids] = step(blob_analyzer, noise_reduction);
...
tracking_on_frame = step(tracking_shape, frame, centroids);