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 默认是逆时针 方向绘制,从 startAngle 到 endAngle。如果 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()
相关推荐
AI的探索之旅4 天前
97 个 OpenCV 实例(三十):双目立体,从标定到点云
人工智能·opencv·计算机视觉
美狐美颜SDK开放平台4 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
词却4 天前
OpenCV学习:CNN 人脸检测
opencv
拉你进_教堂4 天前
小龙虾技能之【Parkinson‘s & Epileptic Behavior Recognition Skill | 帕金森癫痫行为识别技能】简介
人工智能·计算机视觉·多模态大模型·openclaw小龙虾技能
PascalXie4 天前
人形机器人的“眼睛“:多目视觉方案怎么选?
计算机视觉·机器人
普密斯科技4 天前
替代传统影像仪,摄像头磨切片测量新方案实测
计算机视觉·集成测试·测量
yyk333244 天前
OpenCV中的疲劳检测
opencv
宿州派大星4 天前
【Python实战】:基于 OpenCV + dlib 的传统换脸术原理与实战
opencv·python3.11·dlib
陈年老古董4 天前
MediaPipe 姿态检测与脸部关键点检测
笔记·python·opencv·学习·dlib
YOLO数据集集合4 天前
天空红外小目标检测数据集 | 红外小目标 天空目标检测 无人机检测 鸟类识别 低空安防9099期
人工智能·目标检测·计算机视觉·目标跟踪·无人机·无人机视角·直升机检测