【问题标题】:OpenCV's RotatedRect angle does not provide enough informationOpenCV 的 RotatedRect 角度没有提供足够的信息
【发布时间】:2014-06-06 02:13:32
【问题描述】:

根据我的实验,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 度。

我怎样才能找到我应该旋转我的图像以歪斜它的角度?

【问题讨论】:

标签: opencv rotation


【解决方案1】:

在向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,你能详细说明一下吗?已经四年半了。
  • 您提供了一个链接,其中解决方案增加了 180 度,然后您编写了自己的解决方案,增加了 90。有些不一致,删除链接或使用相同的角度添加。
  • 我认为它们是不同的东西。正如我所说,我从两个答案中学习,然后按照描述的方式解决了我的问题。
【解决方案2】:

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

角度总是沿长边计算。

【讨论】:

    【解决方案3】:

    矩形的宽度和高度的切换值与将矩形旋转90度相同。因此,如果角度范围是 180 度而不是 90 度,那么同一个矩形将有 2 种表示形式(宽度、高度、角度)和(高度、宽度、角度+90)。拥有 90 度的范围,您可以表示每个矩形,而且您只能通过一种方式做到这一点。

    【讨论】:

      【解决方案4】:

      这是我使用的(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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-01
        • 2020-03-30
        • 2021-10-29
        • 2020-06-18
        • 1970-01-01
        • 1970-01-01
        • 2017-05-02
        相关资源
        最近更新 更多