You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:08:17