目录
一、什么是 OpenCV
OpenCV(Open Source Computer Vision Library)是一个开源、跨平台的计算机视觉与机器学习库。它由 Intel 于 1999 年发起,如今由非营利组织 OpenCV.org 维护,已经成为全球使用最广泛的视觉库——从学术研究到工业产线、从无人机到自动驾驶,几乎一切"让机器看见"的场景都有它的身影。
OpenCV 的设计哲学可以用三个词概括:
- 免费——BSD 开源协议,商用无需付费
- 快速——核心算法用 C/C++ 编写,底层大量 SIMD(SSE/AVX/NEON)和 GPU 加速
- 全面——2500+ 算法,从图像读写到深度学习推理一应俱全
如果说 TensorFlow / PyTorch 是"大脑"(做推理),那 OpenCV 就是"眼睛 + 视觉皮层"——它负责把图像"读进来、看清楚、提取特征",再把结果喂给大脑。
二、OpenCV 能力矩阵
OpenCV 的能力覆盖了从底层像素操作到高层语义理解的完整链路,可归纳为六大能力域:
| 能力域 | 代表 API | 一句话描述 |
|---|---|---|
| I/O 与编解码 | imread / VideoCapture | 把图像/视频从磁盘或相机读入内存 |
| 图像处理 | GaussianBlur / Canny | 对像素矩阵做滤波、增强、检测 |
| 特征检测 | ORB / SIFT | 从图像中提取" distinctive"关键点 |
| 几何与标定 | calibrateCamera | 算出相机内参、畸变、3D 重建 |
| 目标检测 | CascadeClassifier / DNN | 在图像中框出人脸/物体 |
| 深度学习 | readNetFromONNX | 加载训练好的模型做推理 |
三、核心原理:图像即矩阵
OpenCV 的所有处理都建立在一个基本事实之上:一张图像就是一个数值矩阵。灰度图是二维矩阵,彩色图是三维矩阵(H × W × C)。
cv::Mat 是 OpenCV 的核心数据结构,它有几个关键属性:
- rows / cols:矩阵的行数和列数(即图像的高和宽)
- type:数据类型+通道数,如
CV_8UC1(8 位无符号单通道灰度)、CV_8UC3(8 位无符号三通道 BGR) - data:指向像素数据的裸指针,按行优先存储
- 引用计数:Mat 之间赋值是浅拷贝(共享数据),写时才 copy
OpenCV 默认的色彩顺序是 BGR 而非 RGB!这是因为 OpenCV 早期采用 BGR 顺序(匹配当时相机的传感器输出格式)。用
cvtColor(src, dst, COLOR_BGR2RGB) 可转换为 RGB 顺序后再送入其他库。
四、色彩空间与转换
不同色彩空间适合不同的任务。cv::cvtColor 是色彩空间转换的万能函数。
// 色彩空间转换示例 cv::Mat bgr = cv::imread("photo.jpg"); // 默认 BGR 三通道 cv::Mat gray, hsv, lab; cv::cvtColor(bgr, gray, cv::COLOR_BGR2GRAY); // BGR → 灰度 cv::cvtColor(bgr, hsv, cv::COLOR_BGR2HSV); // BGR → HSV cv::cvtColor(bgr, lab, cv::COLOR_BGR2Lab); // BGR → CIE-LAB
五、图像滤波与卷积
卷积是图像处理最核心的操作:用一个小的卷积核(Kernel)在图像上滑动,每到一个位置,就把核覆盖区域与核做"逐元素乘法再求和",得到输出像素值。
OpenCV 提供了多种现成滤波器,无需手动构造核:
| 滤波器 | API | 效果 | 典型用途 |
|---|---|---|---|
| 均值滤波 | blur() | 取邻域均值 | 快速去噪 |
| 高斯滤波 | GaussianBlur() | 加权均值(中心权重大) | 通用平滑(最常用) |
| 中值滤波 | medianBlur() | 取邻域中位数 | 椒盐噪声去除 |
| 双边滤波 | bilateralFilter() | 保边平滑(考虑像素差) | 美颜/卡通化 |
| 自定义卷积 | filter2D() | 任意核 | 锐化/边缘/Sobel |
六、边缘检测
边缘是图像中亮度变化最剧烈的地方,是物体轮廓的直接描述。Canny 边缘检测是最经典的边缘提取算法,它分四步完成:
七、形态学操作
形态学操作作用于二值图像(黑白图),用一个小结构元素(通常 3×3)在图像上扫描,对前景像素做膨胀或收缩。
| 操作 | API | 组合方式 | 用途 |
|---|---|---|---|
| 膨胀 | dilate() | — | 连接断裂区域、加粗边缘 |
| 腐蚀 | erode() | — | 去除小白点噪声、细化 |
| 开运算 | morphologyEx(MORPH_OPEN) | 先腐蚀再膨胀 | 去除前景上的小颗粒 |
| 闭运算 | morphologyEx(MORPH_CLOSE) | 先膨胀再腐蚀 | 填充前景上的小黑洞 |
八、特征检测与匹配
特征(Feature)是图像中"独特"的点——如果你在两张不同角度拍摄的同一场景照片中找对应关系,这些点最能被匹配上。
九、相机标定
真实相机镜头有制造误差,拍出的图像存在畸变(桶形/枕形)。标定就是通过拍棋盘格,算出相机内参矩阵和畸变系数,从而"把弯曲拉直"。
十、深度学习模块 DNN
OpenCV 从 3.3 版开始内置 dnn 模块,它不是训练框架,而是一个推理引擎——加载 PyTorch / TensorFlow / Caffe / ONNX 导出的模型,在 CPU / CUDA / OpenVINO 上高效推理。
十一、核心特性
| 特性 | 说明 |
|---|---|
| 开源免费 | BSD 协议,学术与商用均无限制,无需公开源码 |
| 跨平台 | Windows / Linux / macOS / Android / iOS 全平台支持 |
| 多语言绑定 | C++ 原生 API,Python / Java / MATLAB / C# 绑定齐全,Python 绑定最流行 |
| SIMD 加速 | 核心循环自动利用 SSE/AVX(x86)和 NEON(ARM),无需改代码 |
| GPU 加速 | OpenCL / CUDA 后端(cuda 模块),DNN 模块支持 CUDA + cuDNN |
| 模块化 | 按需链接:只用 imgproc 就不必链接 dnn/calib3d,嵌入式部署体积可控 |
| UMat 统一内存 | UMat 透明地在 CPU/GPU 间迁移数据,同一套代码跨设备运行 |
| 硬件加速后端 | DNN 模块支持 OpenVINO(Intel)、Vulkan、CUDA、Halide 后端 |
十二、应用场景全景
十三、最简示例
13.1 C++ 版:读图 → 灰度化 → Canny → 显示
// main.cpp — 编译: g++ main.cpp -o main $(pkg-config --cflags --libs opencv4) #include <opencv2/opencv.hpp> int main() { // 1. 读取图像(默认 BGR 三通道) cv::Mat img = cv::imread("test.jpg"); if (img.empty()) return -1; // 2. 转灰度 cv::Mat gray; cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY); // 3. 高斯模糊去噪 cv::Mat blurred; cv::GaussianBlur(gray, blurred, cv::Size(5, 5), 1.5); // 4. Canny 边缘检测 cv::Mat edges; cv::Canny(blurred, edges, 100, 200); // 5. 显示结果 cv::imshow("原始", img); cv::imshow("边缘", edges); cv::waitKey(0); // 按任意键关闭 return 0; }
13.2 Python 版:等价五行代码
# main.py — 运行: python main.py import cv2 as cv img = cv.imread("test.jpg") # 1. 读图 gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 2. 灰度 blur = cv.GaussianBlur(gray, (5,5), 1.5) # 3. 模糊 edges = cv.Canny(blur, 100, 200) # 4. 边缘 cv.imshow("edge", edges); cv.waitKey(0) # 5. 显示
13.3 进阶:YOLOv5 目标检测推理(DNN 模块)
import cv2 as cv import numpy as np # 1. 加载 ONNX 模型 net = cv.dnn.readNetFromONNX("yolov5s.onnx") net.setPreferableBackend(cv.dnn.DNN_BACKEND_CUDA) net.setPreferableTarget(cv.dnn.DNN_TARGET_CUDA) # 2. 图像预处理 → blob(resize + 归一化 + 通道交换) img = cv.imread("street.jpg") blob = cv.dnn.blobFromImage(img, 1/255.0, (640,640), swapRB=True) # 3. 前向推理 net.setInput(blob) detections = net.forward() # 4. 后处理(NMS + 画框,此处省略) # detections → [x, y, w, h, conf, class_id] → 过滤 → 画框 cv.imshow("det", img); cv.waitKey(0)
1. 安装:
pip install opencv-python(Python 版,开箱即用)2. 跑 13.2 节五行代码,看到边缘图 = 入门成功
3. 把
Canny 换成 threshold、HoughCircles 等函数,逐步探索更多能力
十四、总结
OpenCV 核心要点速查
- 定位:计算机视觉"瑞士军刀",2500+ 算法覆盖从 I/O 到 DNN 推理的全链路
- 核心数据结构:
cv::Mat—— 图像即矩阵,灰度 H×W,彩色 H×W×3(BGR) - 六大能力域:I/O → 图像处理 → 特征检测 → 几何标定 → 目标检测 → 深度学习推理
- 色彩空间:BGR(存储/显示)、Gray(检测)、HSV(颜色分割)、LAB(色差比较)
- 经典流程:读图→灰度→滤波→边缘/特征→检测/匹配→输出
- DNN 模块:ONNX/Caffe/TF → blob → forward → NMS,一行
readNetFromONNX搞定推理 - 加速:SIMD 自动 + CUDA/OpenVINO 可选,同一套代码跨设备
- 生态:工业检测、自动驾驶、机器人 SLAM、人脸识别、安防监控、医疗影像、AR/VR
— 全文完 —