Reputation: 79
I have a video stream where the objects( boxes) move in any direction and in any pose. I want to track each and every object. So this is what i did:
1) I found the contours of the object
2) drew bounded boxes around the objects.
3) Calculated the centroid of the bounded box and tracked the objects.
All these works fine. But the centroid of the bounded box is not exactly equal to the center of the object when the object rotates or is in some other pose.
I want the bounded box also to rotate and fit to the shape of the box. When this happens the center of the bounded box is equal to the center of the object. This will also improve my tracking accuracy.
See the picture attached:
If Bounded box is not a solution, is there any there method to find the center of the object
My object is always box shaped and also only the top surface of the object is seen on the video stream.
Upvotes: 3
Views: 5263
Reputation: 33
You can use the moments function once you have your contour. This will give you the centroid directly rather than having to use bounding box.
cv::Moments mu = moments(box_contour, false);
cv::Point2f centroid = Point2f( mu.m10/mu.m00 , mu.m01/mu.m00 );
More detailed example here
Not super experienced with C++ (usually use openCV in Python) but should look something like that :)
Upvotes: 1
Reputation: 762
From the OpenCV documentation here:
// contours : is your blobs found before
// Create a vector to store your rotated rectangles
vector<RotatedRect> minRect( contours.size() );
// in a for loop find rotated rectangles for each blob
for( int i = 0; i < contours.size(); i++ )
{
// minAreaRect() function is for finding Rotated Rectangles
minRect[i] = minAreaRect( Mat(contours[i]) );
}
Upvotes: 2