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()
相关推荐
子夜江寒24 分钟前
基于 OpenCV 的图像形态学与边缘检测
python·opencv·计算机视觉
saoys27 分钟前
Opencv 学习笔记:创建与原图等尺寸的空白图像
笔记·opencv·学习
智驱力人工智能8 小时前
守护流动的规则 基于视觉分析的穿越导流线区检测技术工程实践 交通路口导流区穿越实时预警技术 智慧交通部署指南
人工智能·opencv·安全·目标检测·计算机视觉·cnn·边缘计算
@areok@9 小时前
C++opencv图片(mat)传入C#bitmap图片
开发语言·c++·opencv
MM_MS11 小时前
Halcon基础知识点及其算子用法
开发语言·人工智能·python·算法·计算机视觉·视觉检测
棒棒的皮皮11 小时前
【深度学习】YOLO 模型部署全攻略(本地 / 嵌入式 / 移动端)
人工智能·深度学习·yolo·计算机视觉
棒棒的皮皮12 小时前
【深度学习】YOLO模型速度优化全攻略(模型 / 推理 / 硬件三层维度)
人工智能·深度学习·yolo·计算机视觉
柠檬071114 小时前
fillPoly 函数
opencv
Hi2024021715 小时前
如何通过选择正确的畸变模型解决相机标定难题
人工智能·数码相机·计算机视觉·自动驾驶
棒棒的皮皮15 小时前
【深度学习】YOLO模型精度优化 Checklist
人工智能·深度学习·yolo·计算机视觉