处理cv :: RotatedRect的宽度和高度

时间:2017-01-27 16:14:59

标签: opencv

我需要从4个角定义一个旋转的矩形。旋转的矩形由中心点,尺寸对(宽度,高度)和角度定义。

如何确定哪个尺寸是高度,哪个是宽度?

宽度不是最水平边缘的长度,是吗?例如。如果角度大于90°,​​它是否交换?

2 个答案:

答案 0 :(得分:2)

height应该是最大的一面,width是另一面,而angle是顺时针方向的旋转角度(以度为单位)。

否则,您可以获得一个等效的矩形,其中heightwidth交换,旋转90度。

您可以使用minAreaRect查找RotatedRect

vector<Point> pts = {pt1, pt2, pt3, pt4}

RotatedRect box = minAreaRect(pts);

// Be sure that largest side is the height
if (box.size.width > box.size.height)
{
    swap(box.size.width, box.size.height);
    box.angle += 90.f;
}

答案 1 :(得分:0)

好的,在Miki的帮助下,通过一些测试,我明白了......

似乎旋转的矩形是一个直立的矩形(宽度和高度已明确定义,然后)......旋转了!

在图像坐标中,y指向底部,角度顺时针方向。在通常的数学坐标系(y到顶部)中,角度是逆时针方向。然后,它适合于c ++ <math.h>包含atan2(y,x)函数(除了它返回弧度)。

然后,总而言之,如果我们考虑矩形的一个给定边(两个角),如果我们在其y差和x差上检索atan2的角度,则可以将其长度视为宽度。类似的东西:

 Point pt1, pt2, pt3, pt4;
 RotatedRect rect;

 rect.center = (pt1 + pt2 + pt3 + pt4)/4;

 // assuming the points are already sorted
 rect.size.width = distance(pt1, pt2); // sqrt(...)
 rect.size.height = distance(pt2, pt3);

 rect.angle = atan2(pt2.y-pt1.y, pt2.x-pt1.x);

这可以通过width作为dist(pt1,pt2)dist(pt3,pt4)的平均值来改进。 height也是如此。

angle也可以计算为(pt1,pt2)的atan和(pt3,pt4)的atan的平均值。