绘制旋转对象的边界框

时间:2016-11-03 14:24:56

标签: c++ opencv bounding-box

我有一个视频流,其中的对象(盒子)可以在任何方向和任何姿势中移动。我想跟踪每个对象。所以这就是我所做的:

1)我找到了物体的轮廓

2)在物体周围画出有界的盒子。

3)计算有界框的质心并跟踪对象。

所有这些都很好。但是,当物体旋转或处于其他姿势时,有界框的质心并不完全等于物体的中心。

我希望有界框也能旋转并适合盒子的形状。当发生这种情况时,有界框的中心等于对象的中心。这也将提高我的跟踪准确性。

见附图:

如果有界框不是解决方案,是否有任何方法可以找到对象的中心

我的对象始终是盒形的,并且在视频流中只能看到对象的顶部表面。

enter image description here

2 个答案:

答案 0 :(得分:2)

来自OpenCV文档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]) );
}

答案 1 :(得分:1)

轮廓完成后,您可以使用moments功能。这将直接为您提供质心,而不必使用边界框。

 cv::Moments mu = moments(box_contour, false);
 cv::Point2f centroid = Point2f( mu.m10/mu.m00 , mu.m01/mu.m00 ); 

更详细的示例here

对C ++没有超级经验(通常在Python中使用openCV),但应该看起来像这样:)