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)
相关推荐
yuan1999731 分钟前
OpenCV ViBe 运动检测算法实现
人工智能·opencv·算法
ComputerInBook2 小时前
OpenCV图像处理——边界插值函数 borderInterpolate
图像处理·人工智能·opencv
六点的晨曦3 小时前
OpenCV 4.3 交叉编译 AArch64 完整指南(x64 Ubuntu 20.04)
opencv·交叉编译·ubuntu20.04·aarch64
秋月的私语4 小时前
遥感影像拼接线优化工具:基于Qt+GDAL+OpenCV的从一到二实践
开发语言·qt·opencv
Westward-sun.1 天前
OpenCV + dlib 人脸关键点检测学习笔记(68点)
人工智能·笔记·opencv·学习·计算机视觉
木心术11 天前
openclaw与Hermes的优劣势对比
人工智能·python·opencv·自动化
sali-tec1 天前
C# 基于OpenCv的视觉工作流-章50-霍夫找圆
图像处理·人工智能·opencv·算法·计算机视觉
迷藏4941 天前
**基于Python与OpenCV的光场显示图像处理技术实践**在现代显示技术发展中,**光场显示(Light
java·图像处理·python·opencv
我材不敲代码1 天前
OpenCV+Dlib实战:人脸检测 + 表情识别 + 年龄性别预测
人工智能·opencv·计算机视觉
Westward-sun.1 天前
OpenCV 疲劳检测实战:用 dlib 计算眼睛纵横比 (EAR)
人工智能·opencv·计算机视觉·视觉检测