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

Posted

技术标签:

【中文标题】在python中的openCV中绘制一个旋转的框【英文标题】:Draw a rotated box in openCV in python 【发布时间】:2018-03-14 20:38:16 【问题描述】:

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

谢谢

【问题讨论】:

计算另外两个角的坐标,然后画一个封闭的polyline连接它们。 【参考方案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 获得点数

【讨论】:

【参考方案2】:
   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

【讨论】:

以上是关于在python中的openCV中绘制一个旋转的框的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV Python实现旋转矩形的裁剪

opencv中 如何在视频中画框然后 实现框的旋转?

OpenCV-绘制旋转矩形

裁剪和旋转图片 OpenCV

调整在Python中使用Numpy和OpenCV绘制的多边形的大小

在openCV2 Python中绘制convexHull