transform Points Forward with cell

2 views (last 30 days)
antonio
antonio on 18 Jun 2014
Commented: Dima Lisin on 14 Jul 2014
Hi, I need a help to apply a transformation to a cell array that contains the bboxPolygon values..here's the code:
%% Loop through video while ~isDone(videoReader) % get the next frame videoFrame = step(videoReader);
% Use pointTracker to track feature points
for i = 1:N
[punti{i},validity] = step(tracker{i},videoFrame);
% Keep only the valid points and discard the rest
visiblePoints{i} = punti{i}(validity,:);
oldInliers{i} = oldPoints{i}(validity,:);
[xform, oldInliers{i}, visiblePoints{i}] = estimateGeometricTransform(...
oldInliers{i}, visiblePoints{i}, 'similarity', 'MaxDistance', 4);
end
% Apply the transformation to the bounding box
for i = 1:P
[bbcell{i}(1:2:end),bbcell{i}(2:2:end)]=transformPointsForward(xform, bbcell{i}(1:2:end)...
,bbcell{i}(2:2:end));
end
for i = 1:N
videoFrame = insertShape(videoFrame, 'Polygon',bbcell{i});
videoFrame = insertMarker(videoFrame, visiblePoints{i}, '+', ...
'Color', 'white');
% % Save the new state of the point tracker
% oldPoints{i} = visiblePoints{i};
% setPoints(tracker{i}, oldPoints{i});
% Display output
step(videoPlayer, videoFrame);
end
end
______________________________________
but when I start this code the shapes run away from the video clip or move themselves in wrong direction! Thanks a lot for helping me!

Answers (4)

Dima Lisin
Dima Lisin on 30 Jun 2014
Edited: Dima Lisin on 30 Jun 2014
I would try capturing the output of transformPointsForward() into a temporary variable, and then assigning that to bbcell{i}.
On a different note, it looks like you are trying to track multiple objects. A better way to do that is to use a single vision.PointTracker, rather than multiple ones. The reason is that each of your point tracker objects will pre-process the frame exactly the same way. Using one point tracker will only pre-prosses the frame once, eliminating this wasted computation. However, that means you would need to concatenate all your points into a single Mx2 matrix, and you would need to maintain an Mx1 array of indices to keep track of which point belongs to which object.

antonio
antonio on 1 Jul 2014
Yes but I'm not able to do this with the code in matlab...can you help me? And I don't understand what you mean about to use a single vision.PointTracke. Thanks a lot for the helps!
  1 Comment
Dima Lisin
Dima Lisin on 1 Jul 2014
Can you try this:
[x, y] = transformPointsForward(xform, bbcell{i}(1:2:end),...
bbcell{i}(2:2:end));
bbcell{i}(1:2:end) = x;
bbcell{i}(2:2:end) = y;
As to your second question, you seem to have a cell array of point trackers, one for each object, correct? Instead, you should only use one point tracker for tracking all the points from all the objects.

Sign in to comment.


antonio
antonio on 2 Jul 2014
I tried to use this solution but the rotation of bounding box is casual...I'm going crazy!! ahahah

antonio
antonio on 2 Jul 2014
I'm sending you my full code so you can find some errors...when I'm using one pointTracker, I get this:
"Index exceeds matrix dimensions.
Error in demo (line 77) oldInliers{i} = oldPoints{i}(isFound, :);" ......

Community Treasure Hunt

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

Start Hunting!