本文档对 OpenCV 的完整算法体系做系统性梳理,涵盖 10+ 模块、100+ 核心算法函数,并给出选型决策建议。
一、模块架构总览
OpenCV 采用分层模块化设计,按职责分为五大层次:
| 层次 |
模块 |
核心职责 |
| 基础 I/O 层 |
core, imgcodecs, videoio, highgui |
数据结构 (Mat)、图像/视频读写、GUI 显示 |
| 图像处理层 |
imgproc, photo, stitching |
像素级变换、滤波增强、计算摄影、全景拼接 |
| 特征与检测层 |
features2d, xfeatures2d, objdetect, flann |
关键点检测、描述子、目标检测、近似最近邻 |
| 视频分析层 |
video |
光流、背景建模、目标跟踪 |
| 智能算法层 |
ml, dnn, calib3d |
经典机器学习、深度学习推理、相机标定与 3D 几何 |
设计哲学 :所有模块共享 core 中的 Mat 数据结构,模块间通过 Mat 传递数据,形成统一的流水线。GPU 加速通过 UMat(透明 OpenCL)和各 cuda* 模块实现。
二、imgproc --- 图像处理算法详解
imgproc 是 OpenCV 中算法最密集的模块,包含八大算法类别:
2.1 图像滤波
| 函数 |
用途 |
特点 |
blur / boxFilter |
均值滤波 |
最快,但模糊边缘 |
GaussianBlur |
高斯滤波 |
最常用,高斯噪声效果好 |
medianBlur |
中值滤波 |
椒盐噪声首选,保边缘 |
bilateralFilter |
双边滤波 |
保边去噪,但速度慢 |
filter2D |
自定义卷积核 |
通用卷积接口 |
选型原则:高斯噪声 → GaussianBlur;椒盐噪声 → medianBlur;需保边 → bilateralFilter。
2.2 形态学操作
erode(腐蚀)/ dilate(膨胀):基础操作
morphologyEx:封装了开运算(去噪点)、闭运算(填孔洞)、梯度(提取边缘)、顶帽/黑帽(校正光照不均)
- 核心参数:
getStructuringElement(MORPH_RECT / MORPH_ELLIPSE / MORPH_CROSS)
2.3 阈值化
| 函数 |
场景 |
threshold |
全局阈值,支持 BINARY / TOZERO / TRUNC 等 |
threshold + THRESH_OTSU |
Otsu 自动阈值(双峰直方图最优) |
threshold + THRESH_TRIANGLE |
Triangle 自动阈值(单峰直方图) |
adaptiveThreshold |
自适应阈值,适合光照不均场景 |
2.4 边缘检测
| 函数 |
特点 |
Canny |
多级边缘检测,最常用,含非极大值抑制 |
Sobel |
一阶微分,可指定方向 (x/y) |
Scharr |
Sobel 的 3x3 精度改进版 |
Laplacian |
二阶微分,对噪声敏感 |
2.5 几何变换
resize:缩放(INTER_NEAREST / INTER_LINEAR / INTER_CUBIC / INTER_AREA)
warpAffine:仿射变换(平移、旋转、缩放)
warpPerspective:透视变换
getAffineTransform / getPerspectiveTransform:从点对应关系求变换矩阵
remap:自定义映射,最灵活
2.6 直方图与均衡
calcHist:计算直方图
equalizeHist:全局直方图均衡化
CLAHE (createCLAHE):对比度受限自适应直方图均衡,局部增强首选
calcBackProject:直方图反向投影,用于颜色跟踪
2.7 轮廓与连通域
| 函数 |
用途 |
findContours |
提取轮廓(RETR_EXTERNAL / RETR_TREE) |
approxPolyDP |
多边形逼近 |
contourArea / arcLength |
面积 / 周长 |
moments |
矩(重心、Hu 矩) |
boundingRect / minAreaRect / minEnclosingCircle |
外接矩形/圆 |
connectedComponents / connectedComponentsWithStats |
连通域分析 |
2.8 色彩空间变换
cvtColor:BGR ↔ GRAY / HSV / Lab / YCrCb / HLS 等
- HSV 适合颜色分割(H 通道分离色相);Lab 适合感知差异比较
典型流水线
输入图像 → 预处理(滤波·色彩变换) → 分割(阈值·边缘·形态学) → 特征提取(轮廓·矩·直方图) → 输出(检测·识别·测量)
三、features2d --- 特征检测与匹配
3.1 完整流程
图像 A/B → 关键点检测 → 描述子计算 → 特征匹配 → 几何筛选(RANSAC) → 应用输出
3.2 检测器/描述子对比
| 算法 |
类型 |
尺度不变 |
旋转不变 |
速度 |
授权 |
| SIFT |
检测+描述 (浮点, 128维) |
是 |
是 |
慢 |
免费 (专利已过期) |
| ORB |
检测+描述 (二值, 256位) |
是 |
是 |
快 |
免费 |
| AKAZE |
检测+描述 (非线性扩散) |
是 |
是 |
中 |
免费 |
| SURF |
检测+描述 (浮点, 64维) |
是 |
是 |
较快 |
曾受专利限制 |
| FAST |
仅检测 |
否 |
否 |
极快 |
免费 |
| BRIEF |
仅描述 (二值) |
否 |
否 |
极快 |
免费 |
选型建议:
- 通用首选 ORB(速度与精度的平衡,免费)
- 精度优先 → SIFT(专利已过期,可直接用)
- 极速场景 → FAST + BRIEF 组合
- 非线性尺度空间 → AKAZE
3.3 匹配器
| 匹配器 |
原理 |
适用场景 |
| BFMatcher |
暴力搜索最近邻 |
精确匹配,描述子数量少时 |
| FlannBasedMatcher |
KD-Tree / LSH 近似搜索 |
大量描述子,速度优先 |
匹配优化技巧:
knnMatch (k=2) + Lowe's ratio test(距离比 < 0.7)筛选优质匹配
RANSAC + findHomography / findFundamentalMat 剔除误匹配
- 二值描述子用
NORM_HAMMING,浮点描述子用 NORM_L2
3.4 应用场景
- 图像拼接:特征匹配 → 单应矩阵 → warpPerspective → 融合
- 物体识别:模板特征匹配 → 位姿估计
- SfM (Structure from Motion):多视图特征匹配 → 三角测量 → 稠密重建
- 视觉 SLAM:帧间特征跟踪 → 位姿优化
四、objdetect --- 目标检测
| 算法 |
原理 |
优缺点 |
| Haar Cascade |
Haar-like 特征 + AdaBoost 级联分类器 |
速度快,适合人脸检测;但只支持特定类别 |
| HOG + SVM |
方向梯度直方图 + 支持向量机 |
行人检测经典方案;对遮挡敏感 |
| QRCodeDetector |
二维码检测与解码 |
轻量级,无需深度学习 |
| ArUco |
ArUco 标记检测 |
增强现实、相机位姿 |
现代替代:通用目标检测建议直接使用 dnn 模块加载 YOLO / SSD / Faster R-CNN 模型。
五、video --- 视频分析
5.1 光流法
| 算法 |
类型 |
特点 |
calcOpticalFlowPyrLK |
稀疏光流 (Lucas-Kanade) |
金字塔 LK,跟踪指定点,速度快 |
calcOpticalFlowFarneback |
稠密光流 |
全像素密集光流,精度高但慢 |
5.2 背景建模
| 算法 |
特点 |
createBackgroundSubtractorMOG2 |
混合高斯模型,自适应背景更新 |
createBackgroundSubtractorKNN |
K近邻模型,对阴影更鲁棒 |
createBackgroundSubtractorGMG |
统计方法 + 贝叶斯推断 |
5.3 目标跟踪
| 算法 |
特点 |
TrackerKCF |
核相关滤波,速度快 |
TrackerCSRT |
判别式相关滤波空间可靠性,精度高 |
TrackerMedianFlow |
正反向跟踪一致性检查,适合平稳运动 |
TrackerMOSSE |
最快,适合高速场景但精度低 |
TrackerDaSiamRPN |
基于 Siamese 网络的深度学习跟踪器 |
选型建议:速度优先 → KCF/MOSSE;精度优先 → CSRT;深度学习 → DaSiamRPN。
六、calib3d --- 相机标定与三维几何
6.1 标定流程
棋盘格检测 (findChessboardCorners) → 亚像素精化 (cornerSubPix) → 相机标定 (calibrateCamera) → 去畸变 (undistort)
输出:内参矩阵 (K)、畸变系数 (distCoeffs)、旋转向量 (rvecs)、平移向量 (tvecs)
6.2 核心函数
| 函数 |
用途 |
calibrateCamera |
单目标定 |
stereoCalibrate |
双目立体标定 |
stereoRectify |
双目校正 |
solvePnP / solvePnPRansac |
已知 3D-2D 对应求位姿 |
findHomography |
单应矩阵估计 |
findFundamentalMat |
基础矩阵估计 |
triangulatePoints |
三角测量(3D 重建) |
projectPoints |
3D 点投影到 2D |
6.3 关键概念
- 对极几何:基础矩阵 F (像素坐标) / 本质矩阵 E (归一化坐标)
- PnP 问题:已知 3D 物体点 + 2D 像素点 + 内参 → 求 6DOF 位姿
- 双目视觉:标定 → 校正 → 视差计算 (StereoBM/StereoSGBM) → 深度图
七、ml --- 经典机器学习
所有算法继承自 StatModel 基类,统一接口:train() → predict() → save() / load()。
| 算法 |
类名 |
适用场景 |
| SVM |
cv::ml::SVM |
二分类/多分类,小样本高维 |
| KNN |
cv::ml::KNN |
分类/回归,无需训练但推理慢 |
| 随机森林 |
cv::ml::RTrees |
多分类/回归,特征重要性 |
| Boosting |
cv::ml::Boost |
二分类,弱分类器集成 |
| 多层感知机 |
cv::ml::ANN_MLP |
分类/回归,浅层神经网络 |
| 逻辑回归 |
cv::ml::LogisticRegression |
二分类,概率输出 |
选型建议:小样本高维 → SVM;需要概率 → LogisticRegression;多特征重要性 → RTrees;可解释性 → Boost。
八、dnn --- 深度学习推理
8.1 推理流程
模型文件 → readNet() → blobFromImage() → setInput() → forward() → 后处理(NMS·解码)
8.2 支持格式与后端
| 维度 |
选项 |
| 模型格式 |
ONNX · TensorFlow (.pb) · Caffe · Torch (.t7) · Darknet (.weights) · TFLite |
| Backend |
OPENCV (默认) · CUDA (GPU) · INFERENCE_ENGINE (OpenVINO) |
| Target |
CPU · CUDA · OPENCL · VULKAN |
8.3 典型应用
- 目标检测:加载 YOLOv4/v5/v8 (ONNX) → forward → NMS 后处理
- 图像分类:加载 ResNet/MobileNet → forward → softmax
- 语义分割:加载 FCN/U-Net → forward → argmax
- 人脸检测:加载 SSD/RetinaFace → forward → NMS
与原生框架的区别 :dnn 模块只做推理,不支持训练。优势是无需安装 PyTorch/TensorFlow,部署轻量。
九、photo --- 计算摄影
| 函数 |
用途 |
inpaint |
图像修补(去除水印/划痕) |
fastNlMeansDenoising / fastNlMeansDenoisingColored |
非局部均值去噪 |
mergeMertens / createCalibrateDebevec |
HDR 合成 |
alignMTB |
多曝光图像对齐 |
seamlessClone |
泊松融合(无缝克隆) |
createTonemap |
色调映射 |
十、总结与选型速查
按任务选模块
| 任务 |
首选模块 |
首选算法 |
| 图像去噪 |
imgproc / photo |
GaussianBlur / fastNlMeansDenoising |
| 二值化分割 |
imgproc |
adaptiveThreshold + Otsu |
| 边缘提取 |
imgproc |
Canny |
| 特征匹配 |
features2d |
ORB + BFMatcher + RANSAC |
| 目标检测 |
dnn |
YOLO (ONNX) |
| 人脸检测 |
objdetect / dnn |
Haar Cascade / RetinaFace |
| 目标跟踪 |
video |
CSRT (精度) / KCF (速度) |
| 背景分离 |
video |
MOG2 |
| 相机标定 |
calib3d |
calibrateCamera |
| 位姿估计 |
calib3d |
solvePnP |
| 图像分类 |
ml / dnn |
SVM / ResNet (ONNX) |
| 图像修补 |
photo |
inpaint |
| 全景拼接 |
stitching |
Stitcher::create |
性能优化要点
- UMat 替代 Mat:透明 OpenCL 加速,代码改动最小
- ROI 操作:只处理感兴趣区域,减少计算量
- 多线程:OpenCV 内部已用 TBB/OpenMP 并行,避免外部重复并行
- GPU 模块 :
cuda* 系列模块提供 GPU 原生实现(需编译时启用 CUDA)
- dnn 推理:优先 ONNX 格式 + CUDA backend
- 流水线优化 :
UMat 贯穿全流程避免 CPU-GPU 数据拷贝