OpenCV的旋转矩形角度提供的信息不足。

14

通过我的实验,RotatedRect的角度变量返回的角度范围是-90度到0度,这不足以确定物体是否向左或向右倾斜。

例如,如果角度为-45度,则我们无法判断是需要将其旋转+45度还是-45度来校正它。

下面是我使用的代码片段:

RotatedRect rotated_rect = minAreaRect(contour);
float blob_angle_deg = rotated_rect.angle;
Mat mapMatrix = getRotationMatrix2D(center, blob_angle_deg, 1.0);

将物体向一个方向倾斜,我会得到0度到-90度的角度;而将物体倾斜到另一个方向,则会得到-90度到0度的角度。

如何确定应该旋转图像的角度来矫正它呢?


可能是MinAreaRect angles - Unsure about the angle returned的重复问题。 - jdhao
4个回答

18

在学习了Sebastian SchmitzMichael Burdinov的答案之后,我是这样解决的:

RotatedRect rotated_rect = minAreaRect(contour);
float blob_angle_deg = rotated_rect.angle;
if (rotated_rect.size.width < rotated_rect.size.height) {
  blob_angle_deg = 90 + blob_angle_deg;
}
Mat mapMatrix = getRotationMatrix2D(center, blob_angle_deg, 1.0);

实际上,RotatedRect的角度并不能提供足够的信息来确定物体的角度,您还必须使用RotatedRect的size.widthsize.height


他的答案中加了180,而你加了90。为什么会有这个差异? - Schütze
@Schütze,你能详细说明一下吗?已经过去四年半了。 - João M. S. Silva
你提供了一个链接,其中解决方案添加了180度,然后你编写了自己的解决方案,添加了90度。有些不一致,要么删除链接,要么使用相同的角度进行添加。 - Schütze
我认为它们是不同的东西。正如我所说,我从这两个答案中学到了东西,然后按照描述的方式解决了我的问题。 - João M. S. Silva

4

我在这个帖子中解释了如何将矩形的角度转换为[0-180]。

角度始终沿着较长的一侧计算。


3

交换矩形的宽度和高度相当于将其旋转90度。因此,如果角度范围为180度而不是90度,则同一矩形将具有两种表示方式(宽度、高度、角度)和(高度、宽度、角度+90)。在90度的范围内,您可以仅以一种方式表示每个矩形。


0

这是我使用的代码(c 是我的轮廓)。基本上,我获取最长线段的 du 和 dv,然后使用 atan2() 函数。

rect = cv2.minAreaRect(c)
box = cv2.boxPoints(rect)
origin = box[0]
rect_width, rect_height = rect[1]
if rect_width > rect_height:
     target = box[3]
else:
     target = box[1]
dv = target[1] - origin[1]
du = target[0] - origin[0]
angle_rads = math.atan2(dv, du)

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