OpenCV(十五):绘制矩形和圆

绘制矩形

矩形绘制是通过遍历所有介于 pt1pt2 坐标范围内的像素点,并根据 thickness 参数来决定是只修改边界像素(thickness > 0)还是修改所有内部像素(thickness = -1)。

python 复制代码
cv2.rectangle(img, pt1, pt2, color, thickness, lineType)

参数解析:

参数名 类型 详细说明 关键点
img numpy.ndarray 目标图像(画布)。 绘图操作是直接修改此数组。
pt1 tuple 矩形左上角 的坐标 (x, y) 定义矩形起始点。
pt2 tuple 矩形右下角 的坐标 (x, y) 定义矩形结束点。
color tuple 矩形的颜色,使用 BGR 格式。 e.g., 纯红色是 (0, 0, 255)
thickness int 边框线条的像素粗细。 设为 -1cv2.FILLED 表示填充整个矩形。
lineType int 线条类型,默认 cv2.LINE_8 推荐使用 cv2.LINE_AA(抗锯齿)。

绘制圆形

圆形绘制基于圆的标准方程。函数会计算所有到圆心距离等于半径的像素点,并根据 thickness 确定要修改的像素范围。

python 复制代码
cv2.circle(img, center, radius, color, thickness, lineType)

参数解析:

参数名 类型 详细说明 关键点
img numpy.ndarray 目标图像(画布)。
center tuple 圆形的圆心 坐标 (x, y)
radius int 圆形的半径像素值。 决定圆形的大小。
color tuple 圆形的颜色,使用 BGR 格式。
thickness int 圆形边框的像素粗细。 设为 -1cv2.FILLED 表示填充整个圆形。
lineType int 线条类型,默认 cv2.LINE_8 推荐使用 cv2.LINE_AA(抗锯齿)。

抗锯齿与颜色

颜色格式 (BGR vs. RGB)

OpenCV-Python 在读取图像时,默认的通道顺序是 B (Blue), G (Green), R (Red)。因此,当我们想要定义颜色时,必须使用 BGR 格式的元组:

  • 纯蓝: (255, 0, 0)
  • 纯绿: (0, 255, 0)
  • 纯红: (0, 0, 255)
  • 纯白: (255, 255, 255)
  • 纯黑: (0, 0, 0)

抗锯齿 (Anti-Aliasing)

当线条或曲线以较小的角度绘制时,容易出现阶梯状的边缘,这被称为"锯齿效应" (Aliasing)。

  • cv2.LINE_8 (默认): 普通连接,会产生锯齿。
  • cv2.LINE_AA (Anti-Aliasing): 使用抗锯齿算法,通过平滑边界像素的颜色过渡来消除锯齿,使边缘看起来更平滑、自然。在要求高质量显示的场景中强烈推荐使用。

示例

python 复制代码
import cv2
import numpy as np

# --- 1. 准备画布 ---
H, W = 600, 800
img = np.zeros((H, W, 3), dtype=np.uint8)
# 背景设为中灰色
img[:, :] = (100, 100, 100) 

# --- 2. 绘制矩形 (cv2.rectangle) ---

# 2.1 绘制红色粗边框矩形
pt1_r = (50, 50)
pt2_r = (250, 200)
color_r = (0, 0, 255) # 红色 (BGR)
cv2.rectangle(img, pt1_r, pt2_r, color_r, thickness=6, lineType=cv2.LINE_AA)
# 在矩形旁标注文字
cv2.putText(img, "Red Outline (AA)", (50, 230), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color_r, 2)


# 2.2 绘制绿色填充矩形 (模拟标注框)
pt1_g = (300, 300)
pt2_g = (600, 500)
color_g = (0, 255, 0) # 绿色 (BGR)
cv2.rectangle(img, pt1_g, pt2_g, color_g, thickness=-1)
cv2.putText(img, "Green Filled", (300, 530), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color_g, 2)


# --- 3. 绘制圆形 (cv2.circle) ---

# 3.1 绘制黄色抗锯齿圆形边框
center_y = (700, 100)
radius_y = 70
color_y = (0, 255, 255) # 黄色 (BGR)
cv2.circle(img, center_y, radius_y, color_y, thickness=4, lineType=cv2.LINE_AA)
cv2.putText(img, "Yellow Circle (AA)", (620, 200), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color_y, 2)


# 3.2 绘制品红色填充圆形 (无抗锯齿,对比效果)
center_m = (150, 450)
radius_m = 90
color_m = (255, 0, 255) # 品红色 (BGR)
cv2.circle(img, center_m, radius_m, color_m, thickness=-1, lineType=cv2.LINE_8)
cv2.putText(img, "Magenta Filled", (80, 570), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color_m, 2)


# --- 4. 显示结果 ---
cv2.imshow("OpenCV Drawing Primitives (Rectangle & Circle)", img)
# 等待按键,0表示永远等待
cv2.waitKey(0)
# 销毁所有窗口
cv2.destroyAllWindows()

# 可以选择保存结果
# cv2.imwrite("opencv_drawing_example.png", img)
相关推荐
sali-tec6 天前
C# 基于OpenCv的视觉工作流-章27-图像分割
图像处理·人工智能·opencv·算法·计算机视觉
saoys6 天前
Opencv 学习笔记:腐蚀操作 + 轮廓标记 + 分水岭分割
笔记·opencv·学习
saoys6 天前
Opencv 学习笔记:距离变换(DIST_L1 算法实战 + 归一化)
笔记·opencv·学习
guygg886 天前
图像匹配技术:相关匹配、Hausdorff距离匹配与基于距离变换的Hausdorff距离匹配
图像处理·opencv·计算机视觉
AI科技星6 天前
物理世界的几何建构:论统一场论的本体论革命与概念生成
人工智能·opencv·线性代数·算法·矩阵
fie88896 天前
基于Matlab实现的指纹识别系统流程
opencv·计算机视觉·matlab
sali-tec7 天前
C# 基于OpenCv的视觉工作流-章26-图像拼接
图像处理·人工智能·opencv·算法·计算机视觉
智驱力人工智能7 天前
机场鸟类活动智能监测 守护航空安全的精准工程实践 飞鸟检测 机场鸟击预防AI预警系统方案 机场停机坪鸟类干扰实时监测机场航站楼鸟击预警
人工智能·opencv·算法·安全·yolo·目标检测·边缘计算
Σίσυφος19007 天前
OpenCV 之双线性插值
人工智能·opencv·计算机视觉
格林威7 天前
Baumer相机金属粉末铺粉均匀性评估:用于增材制造过程监控的 7 个实用技巧,附 OpenCV+Halcon 实战代码!
人工智能·opencv·视觉检测·制造·工业相机·智能相机·堡盟相机