OpenCV(十六):椭圆的绘制
概述
在计算机视觉和图形处理中,绘制基本的几何图形是基础操作之一。OpenCV 库提供了强大的绘图功能,其中椭圆(Ellipse)的绘制是实现复杂视觉效果和数据可视化不可或缺的工具。OpenCV 中的椭圆绘制功能不仅能画出完整的椭圆,还能绘制椭圆弧(Elliptic Arc),并且支持旋转和平移,具有高度的灵活性。
核心函数
OpenCV 中用于绘制椭圆或椭圆弧的核心函数是 cv2.ellipse()(Python)或 cv::ellipse()(C++)。
几何学基础
一个椭圆由以下几个核心参数定义:
- 中心点(Center):椭圆在图像上的位置。
- 长轴和短轴(Axes):决定椭圆的大小和形状。
- 旋转角度(Angle):决定椭圆的倾斜方向。
cv2.ellipse()
函数定义
cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness, lineType, shift)
| 参数名称 (Parameter) | 数据类型 (Type) | 描述 (Description) | 核心作用 |
|---|---|---|---|
| img | numpy.ndarray | 要在其上绘制椭圆的图像矩阵。 | 目标画布 |
| center | Tuple (x, y) | 椭圆的中心坐标 (x, y)。 | 位置 |
| axes | Tuple (a, b) | 包含半长轴和半短轴长度的元组 (a, b)。这是椭圆的宽度和高度的一半。 | 尺寸和形状 |
| angle | float | 椭圆的旋转角度(以度为单位)。逆时针方向为正。 | 方向 |
| startAngle | float | 椭圆弧的起始角度(以度为单位)。以水平轴(旋转后的)为0度,逆时针方向递增。 | 弧段起始 |
| endAngle | float | 椭圆弧的结束角度(以度为单位)。 | 弧段结束 |
| color | Tuple (B, G, R) | 绘制椭圆的颜色。对于彩色图像,通常是BGR格式。 | 颜色 |
| thickness | int | 绘制线的粗细(像素)。如果设置为 -1,则椭圆将被填充。 | 线条/填充 |
| lineType | int (Optional) | 线的类型,如 cv2.LINE_AA (抗锯齿)、cv2.LINE_8 (8连接) 等。 | 线条质量 |
| shift | int (Optional) | 坐标点的小数位数(通常设置为 0)。 | 精度 |
关键参数
尺寸定义 (axes)
axes 参数是定义椭圆形状的关键。它是一个元组 (a,b)(a, b)(a,b),其中 aaa 和 bbb 分别是半轴的长度。这意味着椭圆的总宽度是 2a,总高度是 2b(在不旋转的情况下)。
- 当 a = b 时,绘制的结果是一个圆(Circle)。
旋转角度 (angle)
angle 参数定义了整个椭圆的旋转。它决定了哪个半轴将成为长轴,以及椭圆相对于图像坐标系倾斜的角度。
- 0 度:长轴(第一个轴 a)将沿着水平方向。
- 90 度:长轴将沿着垂直方向。
绘制椭圆弧 (startAngle, endAngle)
这两个参数使得 cv2.ellipse() 可以绘制出椭圆的一部分,即椭圆弧。
- 完整椭圆:要绘制一个完整的椭圆,通常将它们设置为 0 和 360(或任何相差 360 度的角度)。
- 绘制方向:OpenCV 默认是逆时针方向绘制,从
startAngle到endAngle。如果endAngle小于startAngle,则绘制方向会是顺时针,但仍是按照最短弧线方向。例如,从 0 度到 180 度绘制上半圆。
填充椭圆 (thickness)
通过将 thickness 参数设置为 -1,可以实现填充椭圆的功能。这在目标遮罩、区域高亮或创建实心形状时非常有用。
线条质量 (lineType)
cv2.LINE_8:标准线条,速度快。cv2.LINE_AA(Anti-Aliasing):抗锯齿线条。它通过在边界上使用平滑的颜色过渡来消除锯齿效应,使图形看起来更平滑、质量更高,但计算量稍大。在最终展示的图像中,推荐使用此类型。
示例
import cv2
import numpy as np# 1. 创建一个空白的黑色画布
# 图像大小 600x600 像素,3 个颜色通道 (BGR)
image_size = 600
canvas = np.zeros((image_size, image_size, 3), dtype=np.uint8)
canvas.fill(50) # 将背景设置为深灰色 (50, 50, 50)# ----------------- 绘制完整的、旋转的椭圆 -----------------# 参数定义
center_1 = (150, 300) # 椭圆中心坐标
axes_1 = (100, 50) # 半轴长度 (半宽100, 半高50)
angle_1 = 45 # 旋转角度 45度
start_angle_1 = 0 # 弧度起始 0度 (完整椭圆)
end_angle_1 = 360 # 弧度结束 360度 (完整椭圆)
color_1 = (0, 255, 255) # 颜色:黄色 (BGR)
thickness_1 = 2 # 线条粗细 2像素
line_type_1 = cv2.LINE_AA # 抗锯齿线条类型# 绘制完整的椭圆
cv2.ellipse(img=canvas, center=center_1, axes=axes_1, angle=angle_1, startAngle=start_angle_1, endAngle=end_angle_1, color=color_1, thickness=thickness_1, lineType=line_type_1
)# ----------------- 绘制填充的椭圆弧 (上半部分) -----------------# 参数定义
center_2 = (450, 300) # 椭圆中心坐标
axes_2 = (150, 80) # 半轴长度 (半宽150, 半高80)
angle_2 = 0 # 旋转角度 0度 (不旋转)
start_angle_2 = 180 # 弧度起始 180度 (从左侧开始)
end_angle_2 = 360 # 弧度结束 360度 (到右侧结束,即上半部分)
color_2 = (255, 0, 0) # 颜色:蓝色 (BGR)
thickness_2 = -1 # 负值表示填充
line_type_2 = cv2.LINE_AA# 绘制填充的椭圆弧
cv2.ellipse(img=canvas, center=center_2, axes=axes_2, angle=angle_2, startAngle=start_angle_2, endAngle=end_angle_2, color=color_2, thickness=thickness_2, lineType=line_type_2
)# ----------------- 额外的:绘制中心点和文字说明 -----------------# 绘制第一个椭圆的中心点
cv2.circle(canvas, center_1, 5, (255, 255, 255), -1)
cv2.putText(canvas, "Rotated Ellipse (45 deg)", (50, 500), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 255), 2)# 绘制第二个椭圆的中心点
cv2.circle(canvas, center_2, 5, (255, 255, 255), -1)
cv2.putText(canvas, "Filled Elliptic Arc (180-360 deg)", (350, 500), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)# ----------------- 显示图像 -----------------cv2.imshow('OpenCV Ellipse Drawing Example', canvas)
cv2.waitKey(0)
cv2.destroyAllWindows()
