<think>我们使用OpenCV在图像上绘制图形。对于矩形,OpenCV提供了直接绘制矩形的函数,包括轴对齐矩形和旋转矩形。对于三角形,由于没有直接绘制三角形的函数,我们可以通过绘制三条线段来形成三角形,或者使用多边形填充来绘制实心三角形。
### 一、绘制矩形
#### 1. 轴对齐矩形(水平/垂直)
使用`cv2.rectangle()`函数,指定左上角和右下角坐标:
```python
import cv2
import numpy as np
# 创建一个黑色背景图像
image = np.zeros((500, 500, 3), dtype=np.uint8)
# 绘制矩形: 左上角(50,50),右下角(200,200),颜色(0,255,0)绿色,线宽2
cv2.rectangle(image, (50, 50), (200, 200), (0, 255, 0), 2)
```
#### 2. 旋转矩形
使用`cv2.boxPoints()`获取旋转矩形的四个顶点,然后用`cv2.drawContours()`绘制:
```python
# 定义旋转矩形的中心点(300,300),宽度200,高度100,旋转角度30度
center = (300, 300)
size = (200, 100) # 宽度和高度
angle = 30
# 计算旋转矩形的四个顶点
rect = ((center), (size), angle)
box = cv2.boxPoints(rect)
box = np.int0(box) # 转换为整数
# 绘制旋转矩形
cv2.drawContours(image, [box], 0, (0, 0, 255), 2)
```
### 二、绘制三角形
#### 方法1:绘制空心三角形(三条线段)
通过连接三个顶点绘制:
```python
# 定义三个顶点
pt1 = (400, 50)
pt2 = (350, 150)
pt3 = (450, 150)
# 绘制三条边
cv2.line(image, pt1, pt2, (255, 0, 0), 2)
cv2.line(image, pt2, pt3, (255, 0, 0), 2)
cv2.line(image, pt3, pt1, (255, 0, 0), 2)
```
#### 方法2:绘制实心三角形(多边形填充)
使用`cv2.fillPoly()`或`cv2.drawContours()`填充多边形:
```python
# 定义三个顶点
pts = np.array([[400, 250], [350, 350], [450, 350]], dtype=np.int32)
# 将顶点数组变形为三维数组(因为fillPoly要求三维数组)
pts = pts.reshape((-1, 1, 2))
# 绘制实心三角形
cv2.fillPoly(image, [pts], (255, 0, 0))
# 或者使用drawContours
# cv2.drawContours(image, [pts], 0, (255,0,0), -1) # -1表示填充
```
### 三、显示图像
```python
cv2.imshow('Shapes', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
### 四、完整示例代码
```python
import cv2
import numpy as np
# 创建黑色背景图像
image = np.zeros((500, 500, 3), dtype=np.uint8)
# 1. 绘制轴对齐矩形(绿色)
cv2.rectangle(image, (50, 50), (200, 200), (0, 255, 0), 2)
# 2. 绘制旋转矩形(红色)
center = (300, 300)
size = (200, 100) # 宽度和高度
angle = 30
rect = (center, size, angle)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(image, [box], 0, (0, 0, 255), 2)
# 3. 绘制空心三角形(蓝色,用三条线)
pt1 = (50, 300)
pt2 = (100, 400)
pt3 = (150, 300)
cv2.line(image, pt1, pt2, (255, 0, 0), 2)
cv2.line(image, pt2, pt3, (255, 0, 0), 2)
cv2.line(image, pt3, pt1, (255, 0, 0), 2)
# 4. 绘制实心三角形(蓝色,用多边形填充)
pts = np.array([[400, 250], [350, 350], [450, 350]], dtype=np.int32)
pts = pts.reshape((-1, 1, 2))
cv2.fillPoly(image, [pts], (255, 0, 0))
# 显示图像
cv2.imshow('Shapes', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
### 五、注意事项
1. 坐标系统:OpenCV图像坐标原点在左上角,x轴向右,y轴向下。
2. 颜色顺序:OpenCV默认使用BGR顺序,即(蓝, 绿, 红)。
3. 线宽:如果线宽设置为负数(如-1)则表示填充图形。
4. 旋转矩形的角度:`cv2.boxPoints`中角度以度为单位,且顺时针为正(与Halcon不同)[^3]。
---
§§相关问题§§
1. OpenCV中如何绘制圆形和椭圆?
2. 如何通过鼠标交互在图像上绘制矩形和三角形?
3. OpenCV中如何计算绘制图形的面积和周长?
4. 如何将绘制的图形作为掩模(mask)应用于图像处理?
[^1]: OpenCV快速入门:绘制图形、图像金字塔和感兴趣区域。
[^2]: [C++] opencv - 绘制基本图形(比如三角形,矩形,圆,椭圆等)。
[^3]: 使用openCV python绘制实心旋转的矩形。
[^4]: 绘多边形:如三角形。
[^5]: 使用OpenCV对图像进行三角形检测、颜色识别与距离估算。</think>### 使用OpenCV在图像上绘制三角形和矩形
OpenCV提供了多种绘制基本图形的方法,以下是绘制三角形和矩形的详细步骤:
---
#### 一、绘制矩形
OpenCV支持两种矩形绘制方式:
1. **轴对齐矩形(水平/垂直)**
```python
import cv2
import numpy as np
# 创建黑色背景
image = np.zeros((500, 500, 3), dtype=np.uint8)
# 绘制矩形:左上角(50,50),右下角(200,200)
# 参数:图像,起点,终点,颜色(BGR),线宽
cv2.rectangle(image, (50, 50), (200, 200), (0, 255, 0), 2) # 绿色矩形
```
2. **旋转矩形**
```python
# 定义旋转矩形:中心(300,300),宽200,高100,旋转角度30°
center = (300, 300)
size = (200, 100) # (宽, 高)
angle = 30
# 获取旋转矩形的四个顶点
rect = (center, size, angle)
box = cv2.boxPoints(rect)
box = np.int0(box) # 转换为整数坐标
# 绘制旋转矩形
cv2.drawContours(image, [box], 0, (0, 0, 255), 2) # 红色旋转矩形
```
---
#### 二、绘制三角形
OpenCV没有直接的三角形绘制函数,可通过以下两种方式实现:
1. **空心三角形(三条线段)**
```python
# 定义三个顶点
pt1 = (400, 50)
pt2 = (350, 150)
pt3 = (450, 150)
# 绘制三条边
cv2.line(image, pt1, pt2, (255, 0, 0), 2) # 蓝色线
cv2.line(image, pt2, pt3, (255, 0, 0), 2)
cv2.line(image, pt3, pt1, (255, 0, 0), 2)
```
2. **实心三角形(多边形填充)**
```python
# 定义顶点坐标
pts = np.array([[100, 300], [50, 400], [150, 400]], dtype=np.int32)
# 绘制实心三角形
cv2.fillPoly(image, [pts], (255, 255, 0)) # 黄色实心三角形
```
---
#### 三、显示和保存结果
```python
# 显示图像
cv2.imshow("Shapes", image)
cv2.waitKey(0)
# 保存结果
cv2.imwrite("output.png", image)
```
---
#### 四、完整示例代码
```python
import cv2
import numpy as np
# 创建黑色背景
image = np.zeros((500, 500, 3), dtype=np.uint8)
# 1. 绘制轴对齐矩形
cv2.rectangle(image, (50, 50), (200, 200), (0, 255, 0), 2)
# 2. 绘制旋转矩形
center = (300, 300)
size = (200, 100)
rect = (center, size, 30)
box = cv2.boxPoints(rect)
cv2.drawContours(image, [np.int0(box)], 0, (0, 0, 255), 2)
# 3. 绘制空心三角形
cv2.line(image, (400, 50), (350, 150), (255, 0, 0), 2)
cv2.line(image, (350, 150), (450, 150), (255, 0, 0), 2)
cv2.line(image, (450, 150), (400, 50), (255, 0, 0), 2)
# 4. 绘制实心三角形
pts = np.array([[100, 300], [50, 400], [150, 400]])
cv2.fillPoly(image, [pts], (255, 255, 0))
# 显示结果
cv2.imshow("Result", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
---
#### 关键参数说明:
1. **颜色格式**:BGR顺序,如`(0, 255, 0)`表示绿色
2. **线宽**:
- 正值:边框厚度
- `-1`:填充图形(仅适用于`cv2.rectangle`)
3. **坐标系统**:原点在左上角,X轴向右,Y轴向下
4. **旋转角度**:顺时针为正方向(与数学坐标系相反)
---
### 效果对比图
| 图形类型 | 示意图 |
|----------|--------|
| 轴对齐矩形 |  |
| 旋转矩形 |  |
| 空心三角形 |  |
| 实心三角形 |  |
> **注意**:实际应用中可通过`cv2.imread()`加载现有图像,在原始图像上绘制图形[^1][^4]。
---