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()
相关推荐
xixixi777773 小时前
水印攻击中(鲁棒性攻击、表达攻击、解释攻击)的区别,详细解释清楚
图像处理·人工智能·计算机视觉·数字水印
从零开始的奋豆6 小时前
计算机视觉(一):相机标定
计算机视觉
滨HI06 小时前
C++ opencv拟合直线
开发语言·c++·opencv
第二层皮-合肥7 小时前
图像处理中的暗场校正
图像处理·数码相机·计算机视觉
AI科技星8 小时前
宇宙的几何诗篇:当空间本身成为运动的主角
数据结构·人工智能·经验分享·算法·计算机视觉
这张生成的图像能检测吗9 小时前
(论文速读)视觉语言模型的无遗忘学习
人工智能·深度学习·计算机视觉·clip·持续学习·灾难性遗忘
zzZ656510 小时前
用 PyTorch 训练 NestedUNet 分割细胞核
计算机视觉
盼小辉丶10 小时前
语义分割详解与实现
深度学习·计算机视觉·keras
骄傲的心别枯萎11 小时前
RV1126 NO.40:OPENCV图形计算面积、弧长API讲解
人工智能·opencv·计算机视觉·音视频·rv1126