如何在Python的OpenCV中绘制旋转矩形(已知参数且不旋转图像)
在OpenCV中绘制旋转矩形(不旋转图像)
我明白你的需求——要直接在原始图像上画出旋转后的矩形,而不是先旋转整个图像,这确实是更高效的做法。下面我会一步步给你讲清楚实现方法,附带完整的代码示例。
核心思路
OpenCV自带的cv2.rectangle只能画轴对齐的矩形,要画旋转矩形,我们可以先算出旋转后矩形的四个顶点坐标,再用多边形绘制函数完成绘制。关键是利用cv2.boxPoints这个工具函数,它能帮我们快速计算旋转矩形的顶点坐标,全程不需要对图像做旋转操作。
具体步骤
假设你已知的参数是:
- 未旋转时矩形的左上角点
top_left(比如(50, 50)) - 未旋转时矩形的右下角点
bottom_right(比如(250, 150)) - 矩形宽度
width、高度height - 旋转角度
angle(单位:度,逆时针为正,顺时针的话传负数即可)
1. 计算旋转中心
旋转中心通常取矩形的几何中心,用左上角和右下角的坐标就能算出:
center = ((top_left[0] + bottom_right[0]) // 2, (top_left[1] + bottom_right[1]) // 2)
2. 构造旋转矩形参数
把中心、宽高、旋转角度打包成一个元组,这是cv2.boxPoints需要的标准输入格式:
rect = (center, (width, height), angle)
3. 获取旋转后的四个顶点
用cv2.boxPoints计算旋转后的顶点坐标,再转成整数像素坐标(因为图像像素坐标是整数):
box = cv2.boxPoints(rect) box = np.int0(box) # 转换为整数类型,符合图像绘制要求
4. 绘制旋转矩形
用cv2.polylines在图像上画出这个闭合的多边形:
cv2.polylines(img, [box], isClosed=True, color=(0, 255, 0), thickness=2)
完整代码示例
import cv2 import numpy as np # 替换成你的实际参数 top_left = (50, 50) bottom_right = (250, 150) width = 200 # 等于bottom_right[0] - top_left[0],可自行验证 height = 100 # 等于bottom_right[1] - top_left[1] angle = 30 # 逆时针旋转30度,顺时针的话写-30即可 # 计算旋转中心 center = ((top_left[0] + bottom_right[0]) // 2, (top_left[1] + bottom_right[1]) // 2) # 构造旋转矩形参数 rect = (center, (width, height), angle) # 获取旋转后的顶点坐标 box = cv2.boxPoints(rect) box = np.int0(box) # 创建空白图像(你可以替换成自己的实际图像) img = np.zeros((400, 400, 3), dtype=np.uint8) # 绘制旋转矩形 cv2.polylines(img, [box], isClosed=True, color=(0, 255, 0), thickness=2) # 显示结果 cv2.imshow('Rotated Rectangle', img) cv2.waitKey(0) cv2.destroyAllWindows()
额外说明
- 如果你的左上角和右下角是旋转后的矩形的两个点,那这两个点的中点就不是旋转中心了,这种情况建议你先通过宽高和旋转角度反推中心,或者直接用旋转矩形的标准参数(中心、宽高、角度)来定义会更准确。
cv2.boxPoints的旋转角度默认是逆时针为正,如果你需要顺时针旋转,只需要传入负数角度即可。- 整个过程完全不需要旋转图像,只是计算顶点坐标后直接绘制,完全符合你的要求。
内容的提问来源于stack exchange,提问作者Richard Price-Jones
相关产品推荐
相关产品推荐

