我需要通过其4个角定义一个旋转矩形。该旋转矩形由一个中心点、一个尺寸对(宽度,高度)和一个角度定义。
如何决定哪个尺寸是高度,哪个是宽度?
宽度不是最水平边缘的长度吗?例如,如果角度大于90°,它是否会交换?
我需要通过其4个角定义一个旋转矩形。该旋转矩形由一个中心点、一个尺寸对(宽度,高度)和一个角度定义。
如何决定哪个尺寸是高度,哪个是宽度?
宽度不是最水平边缘的长度吗?例如,如果角度大于90°,它是否会交换?
height
应该是最大的一边,width
是另外一边,angle
是顺时针旋转角度(以度为单位)。
否则,你可以交换 height
和 width
得到一个等价的矩形,并将其逆时针旋转 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;
}
好的,有了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);
通过使用width
为dist(pt1,pt2)
与dist(pt3,pt4)
的平均值,可以改善这个。同样的方法适用于height
。
angle
也可以计算为(pt1,pt2)的atan
和(pt3,pt4)的atan
的平均值。
box.size.width
或者box.size.height
在Python中的对应语句是什么吗?我找不到关于 RotatedRect 变量类型的 Python 文档。 - csg