Python OpenCV 基础:几何图形与文本绘制实战
计算机视觉中的可视化基础
在计算机视觉和图像处理任务中,将算法结果或调试信息可视化是不可或缺的一环。OpenCV 提供了一套轻量且高效的绘图 API,允许开发者直接在图像矩阵上渲染几何图形和文本。本文将深入探讨如何利用 Python 和 OpenCV 构建自定义的画布,并绘制各类基础元素。
环境依赖
确保你的 Python 环境中已安装 OpenCV 和 NumPy 库。可以通过包管理器进行安装:
pip install opencv-python numpy
面向对象绘图实现
为了提升代码的可维护性与复用性,我们将绘图逻辑封装在一个类中。以下代码展示了如何初始化画布、绘制多种几何图形、渲染文本以及管理显示窗口。
import cv2
import numpy as np
class CanvasRenderer:
def __init__(self, width: int = 640, height: int = 480):
# 初始化一个全黑的三通道画布 (BGR 色彩空间)
self.canvas = np.zeros((height, width, 3), dtype=np.uint8)
def draw_geometries(self):
h, w = self.canvas.shape[:2]
# 绘制青色对角线
cv2.line(self.canvas, (0, 0), (w, h),
color=(255, 255, 0), thickness=2)
# 绘制品红色空心矩形
cv2.rectangle(self.canvas, (60, 60), (260, 180),
color=(255, 0, 255), thickness=3)
# 绘制绿色实心圆 (thickness=-1 等同于 cv2.FILLED)
cv2.circle(self.canvas, (480, 120), 75,
color=(0, 255, 0), thickness=-1)
def add_text(self, content: str, position: tuple):
cv2.putText(self.canvas, content, position,
fontFace=cv2.FONT_HERSHEY_DUPLEX,
fontScale=1.2,
color=(0, 165, 255), # 橙色
thickness=2,
lineType=cv2.LINE_AA) # 启用抗锯齿
def display(self, window_name: str = "Rendering Demo"):
cv2.imshow(window_name, self.canvas)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == "__main__":
renderer = CanvasRenderer(width=640, height=480)
renderer.draw_geometries()
renderer.add_text("OpenCV Visualization", (60, 350))
renderer.display()
核心 API 解析
1. 矩阵画布初始化
在 OpenCV 中,图像本质上是 NumPy 的多维数组。我们使用 np.zeros 创建一个全零矩阵,这在 BGR 色彩空间下表现为纯黑色背景。元组 (height, width, 3) 定义了图像的空间维度与色彩通道,np.uint8 确保像素值限制在 0-255 的标准范围内,这是图像处理中最常用的数据类型。
2. 几何图形渲染
- 直线 (
cv2.line):通过指定起点和终点的二维坐标元组来绘制线段。颜色参数严格遵循 BGR(蓝、绿、红)顺序,而非传统的 RGB。 - 矩形 (
cv2.rectangle):需要定义左上角和右下角的坐标。当thickness参数设置为-1或cv2.FILLED时,矩形内部将被指定颜色完全填充。 - 圆形 (
cv2.circle):除了中心点坐标外,还需提供半径值。该函数同样支持通过调整线宽参数来实现空心边框或实心色块。
3. 文本叠加
cv2.putText 用于在图像矩阵上绘制字符串。需要注意的是,OpenCV 原生仅支持有限的几种 Hershey 字体(如 FONT_HERSHEY_DUPLEX)。参数 fontScale 控制字体的基础缩放比例,而引入 lineType=cv2.LINE_AA 则能开启抗锯齿渲染,使文本边缘在放大时更加平滑,避免明显的像素锯齿感。
4. 窗口与事件循环
cv2.imshow 负责将内存中的图像矩阵映射到操作系统的 GUI 窗口。cv2.waitKey(0) 会阻塞主线程,使程序暂停执行,直到用户按下任意键盘按键。最后,调用 cv2.destroyAllWindows() 是一项重要的工程实践,用于彻底释放窗口资源并关闭底层 UI 线程,避免在复杂应用中引发内存泄漏或进程挂起。