概述

在计算机视觉和图形处理中,绘制基本的几何图形是基础操作之一。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),其中 aaabbb 分别是半轴的长度。这意味着椭圆的总宽度是 2a,总高度是 2b(在不旋转的情况下)。

  • 当 a = b 时,绘制的结果是一个圆(Circle)

旋转角度 (angle)

angle 参数定义了整个椭圆的旋转。它决定了哪个半轴将成为长轴,以及椭圆相对于图像坐标系倾斜的角度。

  • 0 度:长轴(第一个轴 a)将沿着水平方向。
  • 90 度:长轴将沿着垂直方向。

绘制椭圆弧 (startAngle, endAngle)

这两个参数使得 cv2.ellipse() 可以绘制出椭圆的一部分,即椭圆弧

  • 完整椭圆:要绘制一个完整的椭圆,通常将它们设置为 0 和 360(或任何相差 360 度的角度)。
  • 绘制方向:OpenCV 默认是逆时针方向绘制,从 startAngleendAngle。如果 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()
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐