OpenCV(十六):椭圆的绘制

概述

在计算机视觉和图形处理中,绘制基本的几何图形是基础操作之一。OpenCV 库提供了强大的绘图功能,其中椭圆(Ellipse)的绘制是实现复杂视觉效果和数据可视化不可或缺的工具。OpenCV 中的椭圆绘制功能不仅能画出完整的椭圆,还能绘制椭圆弧(Elliptic Arc) ,并且支持旋转和平移,具有高度的灵活性。

核心函数

OpenCV 中用于绘制椭圆或椭圆弧的核心函数是 cv2.ellipse()(Python)或 cv::ellipse()(C++)。

几何学基础

一个椭圆由以下几个核心参数定义:

  • 中心点(Center):椭圆在图像上的位置。
  • 长轴和短轴(Axes):决定椭圆的大小和形状。
  • 旋转角度(Angle):决定椭圆的倾斜方向。

cv2.ellipse()

函数定义

python 复制代码
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 默认是逆时针 方向绘制,从 startAngleendAngle。如果 endAngle 小于 startAngle,则绘制方向会是顺时针,但仍是按照最短弧线方向。例如,从 0 度到 180 度绘制上半圆。

填充椭圆 (thickness)

通过将 thickness 参数设置为 -1 ,可以实现填充椭圆的功能。这在目标遮罩、区域高亮或创建实心形状时非常有用。

线条质量 (lineType)

  • cv2.LINE_8:标准线条,速度快。
  • cv2.LINE_AA (Anti-Aliasing)抗锯齿线条。它通过在边界上使用平滑的颜色过渡来消除锯齿效应,使图形看起来更平滑、质量更高,但计算量稍大。在最终展示的图像中,推荐使用此类型。

示例

python 复制代码
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()
相关推荐
HaiLang_IT19 小时前
计算机视觉选题指南(2026版):图像分类、目标检测、分割等热门方向详解
计算机视觉·分类·课程设计
Techblog of HaoWANG21 小时前
目标检测与跟踪 (8)- 机器人视觉窄带线激光缝隙检测系统开发
人工智能·opencv·目标检测·机器人·视觉检测·控制
2501_9414185521 小时前
【计算机视觉】基于YOLO11-P6的保龄球检测与识别系统
人工智能·计算机视觉
编码小哥1 天前
OpenCV图像滤波技术详解:从均值滤波到双边滤波
人工智能·opencv·均值算法
格林威1 天前
Baumer相机金属焊缝缺陷识别:提升焊接质量检测可靠性的 7 个关键技术,附 OpenCV+Halcon 实战代码!
人工智能·数码相机·opencv·算法·计算机视觉·视觉检测·堡盟相机
Ryan老房1 天前
无人机航拍图像标注-从采集到训练全流程
yolo·目标检测·机器学习·计算机视觉·目标跟踪·无人机
Ryan老房1 天前
开源vs商业-数据标注工具的选择困境
人工智能·yolo·目标检测·计算机视觉·ai
困死,根本不会1 天前
OpenCV摄像头实时处理:基于 HSV 颜色空间的摄像头实时颜色筛选工具
人工智能·opencv·计算机视觉
Sagittarius_A*1 天前
角点检测:Harris 与 Shi-Tomasi原理拆解【计算机视觉】
图像处理·人工智能·python·opencv·计算机视觉
困死,根本不会1 天前
OpenCV实时摄像头处理:曝光调节、降噪与二值化实战
人工智能·opencv·计算机视觉