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)
相关推荐
却道天凉_好个秋1 小时前
OpenCV(四十三):分水岭法
人工智能·opencv·计算机视觉·图像分割·分水岭法
编码小哥3 小时前
OpenCV几何变换详解:缩放、旋转与平移
人工智能·opencv·计算机视觉
jghhh011 天前
基于阈值分割的车牌定位识别
图像处理·opencv·计算机视觉
陈天伟教授2 天前
人工智能训练师认证教程(4)OpenCV 快速实践
人工智能·python·神经网络·opencv·机器学习·计算机视觉
百***78752 天前
【技术教程】3步极速接入GPT-5.1:零门槛体验多模态AI能力
android·java·人工智能·gpt·opencv
劈星斩月2 天前
OpenCV 学习10-边缘检测(Edge Detection)
opencv·边缘检测
骄傲的心别枯萎3 天前
RV1126 NO.57:ROCKX+RV1126人脸识别推流项目之读取人脸图片并把特征值保存到sqlite3数据库
数据库·opencv·计算机视觉·sqlite·音视频·rv1126
中年程序员一枚3 天前
cv2.sqrBoxFilter 是 OpenCV 中用于计算像素邻域平方和的盒式滤波函数
人工智能·opencv·计算机视觉
棒棒的皮皮3 天前
【OpenCV】Python图像处理之平滑处理
图像处理·python·opencv·计算机视觉
棒棒的皮皮3 天前
【OpenCV】Python图像处理之重映射
图像处理·python·opencv·计算机视觉