在python中的openCV中绘制一个旋转的框

时间:2018-03-14 20:38:17

标签: python opencv computer-vision

我想绘制一个旋转的矩形,我有左上角和右下角,框的宽度和高度。以及角度。但我似乎无法弄清楚如何在 Python 中使用OpenCV绘制旋转的矩形。请注意,我不想旋转图像。

谢谢

2 个答案:

答案 0 :(得分:1)

在OpenCV中绘制矩形的方法有很多种。

来自OpenCV文件:Drawing Functions

  

<强>矩形

     

绘制一个简单,厚实或填充右上方的矩形。

因此,当你想要旋转它时,这个功能没有帮助。

矩形只是一个特殊的4边多边形。因此,只需使用该函数来绘制多边形。

  

<强>折线

     

绘制几条多边形曲线。

     

Python:

cv2.polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]]) → img

并插入旋转矩形的4个顶点

或使用

分别绘制4面
  

订单

     

绘制连接两个点的线段。

  

<强> drawContours

     

绘制轮廓轮廓或填充轮廓。

可以使用简单的数学方法获得分数,例如使用OpenCV的RotatedRect https://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#rotatedrect

答案 1 :(得分:0)

   class Point:

        def __init__(self, x, y):
            self.x = int(x)
            self.y = int(y)


    class Rectangle:

        def __init__(self, x, y, w, h, angle):

            # Center Point
            self.x = x
            self.y = y
            # Height and Width
            self.w = w
            self.h = h
            self.angle = angle

        def rotate_rectangle(self, theta):
            pt0, pt1, pt2, pt3 = self.get_vertices_points()

            # Point 0
            rotated_x = math.cos(theta) * (pt0.x - self.x) - math.sin(theta) * (pt0.y - self.y) + self.x
            rotated_y = math.sin(theta) * (pt0.x - self.x) + math.cos(theta) * (pt0.y - self.y) + self.y
            point_0 = Point(rotated_x, rotated_y)

            # Point 1
            rotated_x = math.cos(theta) * (pt1.x - self.x) - math.sin(theta) * (pt1.y - self.y) + self.x
            rotated_y = math.sin(theta) * (pt1.x - self.x) + math.cos(theta) * (pt1.y - self.y) + self.y
            point_1 = Point(rotated_x, rotated_y)

            # Point 2
            rotated_x = math.cos(theta) * (pt2.x - self.x) - math.sin(theta) * (pt2.y - self.y) + self.x
            rotated_y = math.sin(theta) * (pt2.x - self.x) + math.cos(theta) * (pt2.y - self.y) + self.y
            point_2 = Point(rotated_x, rotated_y)

            # Point 3
            rotated_x = math.cos(theta) * (pt3.x - self.x) - math.sin(theta) * (pt3.y - self.y) + self.x
            rotated_y = math.sin(theta) * (pt3.x - self.x) + math.cos(theta) * (pt3.y - self.y) + self.y
            point_3 = Point(rotated_x, rotated_y)

            return point_0, point_1, point_2, point_3

返回由theta翻译的四个新点

https://github.com/rij12/YOPO/blob/yopo/darkflow/net/yopo/calulating_IOU.py