OpenCV 是什么:模块划分与端侧定位
OpenCV 是什么:模块划分与端侧定位
OpenCV 是一套开源的计算机视觉与图像处理库,同时提供 C++ 与 Python 两套接口。它的价值不在于某个算法特别强,而在于把图像读取、颜色空间转换、几何变换、滤波、特征提取、相机标定、深度网络推理这些环节全部收拢到一套统一的数据结构和 API 之下,让「读取→预处理→推理→后处理」这条链路可以在一份代码里写完。
理解 OpenCV 的第一步是理解它的模块划分,因为端侧部署的本质就是「选模块 + 关模块」。默认的全量构建体积很大,而端侧只需要其中几个:
| 模块 | 职责 | 端侧是否常用 |
|---|---|---|
core | cv::Mat、矩阵与逐元素运算、基础数据结构 | 必选,几乎所有模块都依赖它 |
imgproc | 滤波、形态学、颜色空间转换、缩放、几何变换 | 必选,预处理主力 |
imgcodecs | imread / imwrite、编解码后端 | 常用,纯视频流场景可省 |
videoio | VideoCapture / VideoWriter、相机与视频文件接入 | 常用,对接工业相机时必选 |
highgui | 窗口显示、滑动条、键盘事件 | 端侧一般关掉,靠无头方式运行 |
dnn | 加载 ONNX 等模型并推理,含 blobFromImage 与 NMS | 端侧常用,AI 视觉核心 |
calib3d | 相机标定、solvePnP、立体视觉 | 按需,涉及测量与位姿时使用 |
features2d | ORB、FAST、SIFT 等特征点与描述子匹配 | 按需,定位与拼接类任务使用 |
objdetect | Haar、HOG 检测器与二维码识别 | 按需 |
端侧部署的整个思路就建立在上面这张表上:把 BUILD_LIST 限定在真正用到的模块,编译出的库体积和编译时间都会明显下降,交叉编译到 ARM 板时尤其明显。
几个必须提前记住的术语与约定:cv::Mat 是图像与矩阵的统一容器,由「头信息 + 像素数据」两部分组成;引用计数让 Mat 的拷贝变成廉价的浅拷贝,只有显式 clone() 或 copyTo() 才真正复制数据;BGR 通道序是 OpenCV 的历史默认值,imread 读出来的彩色图是 BGR 而不是 RGB;blob 是把图像按模型要求做缩放、归一化、通道重排之后得到的四维张量,通常形状是 NCHW;NMS(非极大值抑制)是检测类模型输出后处理的标准步骤,用于合并重叠框。

