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)
相关推荐
一招定胜负18 小时前
基于dlib和OpenCV的人脸替换技术详解
opencv·计算机视觉
勾股导航1 天前
OpenCV图像坐标系
人工智能·opencv·计算机视觉
格林威1 天前
Baumer相机玻璃制品裂纹自动检测:提高透明材质检测精度的 6 个关键步骤,附 OpenCV+Halcon 实战代码!
人工智能·opencv·视觉检测·材质·工业相机·sdk开发·堡盟相机
没有不重的名么2 天前
Multiple Object Tracking as ID Prediction
深度学习·opencv·计算机视觉·目标跟踪
愚者游世2 天前
Opencv知识点大纲
人工智能·opencv·计算机视觉
格林威2 天前
Baumer相机电池极耳对齐度检测:提升叠片工艺精度的 5 个实用方案,附 OpenCV+Halcon 实战代码!
人工智能·opencv·机器学习·计算机视觉·视觉检测·工业相机·堡盟相机
403240732 天前
【Jetson开发避坑】虚拟环境(Conda/Venv)调用系统底层OpenCV与TensorRT的终极指南
人工智能·opencv·conda
格林威2 天前
Baumer相机电机转子偏心检测:实现动平衡预判的 5 个核心方法,附 OpenCV+Halcon 实战代码!
人工智能·深度学习·opencv·机器学习·计算机视觉·视觉检测·工业相机
侯孟禹2 天前
Gemini写的抠图工具
qt·opencv
qwy7152292581632 天前
17-像素点和ROI操作
人工智能·opencv·计算机视觉