微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何更改 cv2 矩形的角度?

如何解决如何更改 cv2 矩形的角度?

我使用 cv2 矩形作为边界框,我想将它绕其轴旋转某个角度。由于warpAffine函数是用来旋转图片的,所以这里无法使用。

解决方法

我使用它已经有一段时间了,但据我所知,所有这些 ROI 类型都只是简单的 x-y 矩形。没有旋转是可能的(您也可以从构造函数中看到,无法定义旋转)。所以它总是沿 x 轴宽,沿 y 轴高。

如果你只想画矩形,我建议只确定所有四个角点,然后通过简单的线条绘制边界框。最终,您可以使用折线在一个命令中完成。

,

cv2 中没有内置函数来执行此操作。您可以通过确定旋转矩形的四个角的坐标来解决这个问题,使用 cv2.polylines 绘制它。

这是一个完全这样做的函数,可以用作 cv2.rectangle 的直接替换 - 唯一的附加参数是 rotation(应该以度为单位):

import numpy as np
from numpy import cos,sin

def rotated_rectangle(image,start_point,end_point,color,thickness,rotation=0):
    center_point = [(start_point[0]+end_point[0])//2,(start_point[1]+end_point[1])//2]
    height = end_point[1] - start_point[1]
    width = end_point[0] - start_point[0]
    angle = np.radians(rotation)
    
    # Determine the coordinates of the 4 corner points
    rotated_rect_points = []
    x = center_point[0] + ((width / 2) * cos(angle)) - ((height / 2) * sin(angle))
    y = center_point[1] + ((width / 2) * sin(angle)) + ((height / 2) * cos(angle))
    rotated_rect_points.append([x,y])
    x = center_point[0] - ((width / 2) * cos(angle)) - ((height / 2) * sin(angle))
    y = center_point[1] - ((width / 2) * sin(angle)) + ((height / 2) * cos(angle))
    rotated_rect_points.append([x,y])
    x = center_point[0] - ((width / 2) * cos(angle)) + ((height / 2) * sin(angle))
    y = center_point[1]- ((width / 2) * sin(angle)) - ((height / 2) * cos(angle))
    rotated_rect_points.append([x,y])
    x = center_point[0] + ((width / 2) * cos(angle)) + ((height / 2) * sin(angle))
    y = center_point[1] + ((width / 2) * sin(angle)) - ((height / 2) * cos(angle))
    rotated_rect_points.append([x,y])
    cv2.polylines(image,np.array([rotated_rect_points],np.int32),True,thickness)
,

如果您需要对点而不是整个图像应用仿射变换,则可以使用 cv.transformcv.getRotationMatrix2D 为您提供仿射变换以围绕任意中心旋转矩形点。

OpenCV 有 RotatedRect 的概念。给定宽度、高度和角度,您可以轻松构建它们。您不需要了解任何三角函数,也完全不需要计算。

RotatedRect::points() 为您提供矩形的角。您可以使用它们将矩形绘制为多边形或“轮廓”。

Python 中的等效函数是 cv.boxPoints 函数。它采用表示 RotatedRect C++ 结构的 Python 数字元组。

这些函数/方法的文档还引用了包含在 OpenCV 文档中的 tutorial。它使用 drawContours 并将四个角点作为一个轮廓传递。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。