OpenCV的RotatedRect角度不能提供足够的信息

时间:2014-06-06 02:13:33

标签: opencv rotation

从我的实验中,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度的角度。

如何找到旋转图像以使其偏斜的角度?

4 个答案:

答案 0 :(得分:14)

在了解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

答案 1 :(得分:4)

我解释了如何在this thread中将矩形的角度转换为[0-180]。

角度始终沿长边计算。

答案 2 :(得分:3)

切换矩形的宽度和高度值与将其旋转90度相同。因此,如果角度范围是180度而不是90度,则相同的矩形将具有2个表示(宽度,高度,角度)和(高度,宽度,角度+ 90)。范围为90度,您可以表示每个矩形,您只能以一种方式完成。

答案 3 :(得分: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)