在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中绘制一个旋转的框的主要内容,如果未能解决你的问题,请参考以下文章