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

5

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

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

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

2个回答

4

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;
}

你知道box.size.width或者box.size.height在Python中的对应语句是什么吗?我找不到关于 RotatedRect 变量类型的 Python 文档。 - csg

2

好的,有了Miki的帮助和一些测试,我更清楚地理解了...

看起来旋转的矩形是一个正立的矩形(宽度和高度明确定义),然后被旋转!

在图像坐标系中,y向下,角度顺时针给出。在通常的数学坐标系中(y朝上),角度逆时针给出。然后,它与c++<math.h>中包含的atan2(y,x)函数相符合(除了它返回弧度)。

因此,为了总结,如果我们考虑矩形的一个给定边缘(两个角落),如果我们使用atan2获取其y差异和x差异的角度,则其长度可以被视为宽度。类似于:

 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);

通过使用widthdist(pt1,pt2)dist(pt3,pt4)的平均值,可以改善这个。同样的方法适用于height

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接