OpenCV
OpenCV 是一个开源库,包含 2,500 多种图像处理和计算机视觉算法。了解它的功能、如何与深度学习配合使用,以及相关代码。
OpenCV(开源计算机视觉库)是一个开源库,包含 2,500 多种用于图像处理和计算机视觉 (CV)的优化算法。它可以读写图像和视频、采集摄像头视频流、过滤和变换像素、检测并匹配特征、标定摄像头,以及运行经过训练的神经网络。OpenCV 于 1999 年在 Intel Research 启动,使用 C++ 编写,并提供 Python 和 Java 绑定;自 4.5.0 版起,它采用 Apache 2.0 许可证发布。在 Python 中,可通过 pip install opencv-python 安装并以 cv2 导入,而且它会将每张图像表示为 NumPy 数组。
OpenCV 的功能#
- 图像和视频 I/O:读写常见图像格式、解码视频文件,以及从摄像头和网络流中采集帧。
- 图像处理:调整尺寸、转换色彩空间、模糊、锐化、阈值处理和形态学操作;这些都是图像输入模型前的标准预处理步骤。
- 特征检测与匹配:SIFT 和 ORB 等角点与关键点检测器会找到具有显著特征的点,以便在全景拼接、对象定位和视觉 SLAM 中跨图像匹配。SIFT 专利到期后,于 4.4.0 版进入 OpenCV 主库。
- 摄像头几何:标定可消除镜头畸变,单应性可校正透视,而立体匹配则可通过两个摄像头恢复深度,应用于机器人和 3D 重建。
- 视频分析:背景减除可将运动对象与静态场景分离,光流则用于测量像素在帧间的移动情况。
- 深度神经网络推理:
dnn模块可以加载经过训练的模型(例如 ONNX 格式模型),并在未安装深度学习框架的情况下通过 CPU 或 GPU 运行模型。
这个传统流水线无需任何训练模型,就能找到图像中形状的轮廓:
import urllib.request
import cv2
import numpy as np
# Download a sample image and decode it into a BGR NumPy array
data = urllib.request.urlopen("https://ultralytics.com/images/bus.jpg").read()
image = cv2.imdecode(np.frombuffer(data, np.uint8), cv2.IMREAD_COLOR)
# Classical pipeline: grayscale, blur to suppress noise, then Canny edge detection
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edges = cv2.Canny(blurred, 50, 150)
# Trace connected edge pixels into contours, the outlines of shapes in the scene
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
print(f"Image shape: {image.shape}, contours found: {len(contours)}")它会打印 Image shape: (1080, 810, 3), contours found: 1449:一张 1080×810、包含三个颜色通道的图像,以及从其边缘追踪出的 1,449 条独立轮廓。OpenCV 按蓝绿红 (BGR) 顺序存储颜色通道,因此将图像传给需要 RGB 的库之前,必须先进行 cv2.cvtColor 转换。
OpenCV 与深度学习框架#
OpenCV 与 PyTorch、TensorFlow等深度学习框架在同一流水线的不同阶段发挥作用。OpenCV 负责网络前后的数据预处理和输出工作,包括抓取帧、调整尺寸、绘制结果和写出视频;框架则负责训练并运行其中的卷积神经网络。实时视频应用会对每一帧循环执行这些步骤:
Ultralytics YOLO26可直接接收 OpenCV 的 BGR NumPy 帧,而 results[0].plot() 会以相同格式返回带标注的帧,因此模型无需任何转换即可接入 OpenCV 循环。本示例使用 ultralytics 包中附带的示例图像,运行一次循环:
import cv2
from ultralytics import YOLO
from ultralytics.utils import ASSETS
# OpenCV 将包中附带的示例图像加载为 BGR NumPy 数组
frame = cv2.imread(str(ASSETS / "bus.jpg"))
# YOLO26 直接接收 OpenCV 帧
model = YOLO("yolo26n.pt")
results = model(frame)
# plot() 返回带标注的 BGR 数组,OpenCV 可以显示或保存该数组
annotated = results[0].plot()
cv2.imwrite("bus_annotated.jpg", annotated)在视频循环中,对来自 cv2.VideoCapture 的每一帧都会运行相同的三个调用,并由 cv2.imshow 或 cv2.VideoWriter 替换 cv2.imwrite。










