本文目录导读:

- 核心架构与 C++ 标准:转向 C++11
- 核心模块 (core) 的优化与改进
- 图像处理 (imgproc) 模块的重大变化
- 深度神经网络模块 (dnn) 的彻底重写
- 视频分析 (video) 模块
- 其他模块更新
- 对新硬件的支持
- 架构与模块调整
- 总结:开发者迁移时需要注意什么?
OpenCV 4.0 是计算机视觉库的一个重大版本更新,发布于 2018 年 11 月,相比于 3.x 系列,它在核心架构、功能模块、算法性能和硬件支持方面都有显著变化。
核心亮点和主要更新内容如下:
核心架构与 C++ 标准:转向 C++11
- 最低要求 C++11:OpenCV 4.0 放弃了 C++98 标准,要求编译器支持 C++11,这使得代码可以利用现代 C++ 特性,如
auto、移动语义、std::shared_ptr等,代码更简洁、性能更优。 - 去除 C 语言 API:大量旧式的 C 语言风格 API(如
cv::前缀下的CvMat、IplImage)大部分被移除或标记为弃用,推荐全面使用 C++ 接口(如cv::Mat)。
核心模块 (core) 的优化与改进
- 性能提升:对矩阵运算、数据结构和内存管理进行了深度优化,特别是在 ARM 和 x86 架构上利用 SIMD(单指令多数据流)指令集。
cv::Mat改进:Mat对象的内存管理更高效,支持移动语义。OutputArray/InputArray简化:这些用于函数参数传递的“代理”类在内部处理上更直接。Size和Point类改进:增加了更方便的构造函数和运算符。
图像处理 (imgproc) 模块的重大变化
cv::Canny()更新:新的实现基于更高效的算法,性能更好,且不再需要L2gradient参数(默认为 L2 范数)。cv::resize()新插值方法:INTER_AREA改进了下采样质量。- 新增了
INTER_LINEAR_EXACT(精确线性插值)和WARP_POLAR_LOG/WARP_POLAR_LINEAR(用于极坐标变换)。
cv::blur()和cv::GaussianBlur():内部实现性能优化,尤其是在多线程下。
深度神经网络模块 (dnn) 的彻底重写
这是最重要、最受关注的更新之一,OpenCV 4.0 的 dnn 模块从底层进行了重组。
- 新增 ONNX 支持:支持 ONNX 格式,这意味着可以直接加载由 PyTorch、TensorFlow、Caffe2、MXNet 等导出为 ONNX 格式的模型。
- 改进的层支持:支持了更多常见的深度学习层(如
BatchNorm、ReLU6、Swish、Mish等)。 - 性能提升:推理速度显著加快,支持 VGG、ResNet、MobileNet、YOLO、SSD、OpenPose 等主流网络。
- 简化 API:
cv::dnn::Net类的使用更直观。
视频分析 (video) 模块
- 跟踪器大更新:
- 移除了旧版低效的跟踪器(如
MIL、BOOSTING、TLD、MEDIANFLOW)。 - 保留了
CSRT(Discriminative Correlation Filter with Channel and Spatial Reliability,通道和空间可靠性判别相关滤波)、KCF(Kernelized Correlation Filters,核相关滤波)、MOSSE(Minimum Output Sum of Squared Error,最小输出均方误差) 等。
- 移除了旧版低效的跟踪器(如
- 光流算法:
calcOpticalFlowFarneback和calcOpticalFlowPyrLK性能优化。
其他模块更新
- 图像特征 (features2d):AKAZE、ORB、BRISK 等特征检测器性能提升。
- 3D 视觉 (calib3d):
calibrateCamera()和findChessboardCorners()等标定函数改进,支持更多棋盘格模式。 - 机器学习 (ml):决策树、随机森林、SVM 等模型训练效率优化。
- 图像拼接 (stitching):拼接质量改进,尤其是对于多视角和大图像。
对新硬件的支持
- Intel Inference Engine:优化了对 Intel 的 CPU、GPU、VPU(如 Movidius)的推理支持。
- Vulkan(可选):开始支持 Vulkan 作为后端,用于 GPU 加速某些操作(当时仍处于实验阶段)。
- CUDA:
opencv_contrib模块中的 CUDA 支持得到改进。
架构与模块调整
- 部分模块移入
opencv_contrib:一些非核心或尚不稳定的模块(如xfeatures2d、text、aruco等)被移到了额外的opencv_contrib仓库中,需要单独编译安装。 - 模块命名简化:一些模块的命名空间或内部类名更规范。
开发者迁移时需要注意什么?
如果你是从 OpenCV 3.x 升级到 4.0:
- 必须使用 C++11 编译器(VS 2015+、GCC 4.8+、Clang 3.3+)。
- 检查 C 风格 API:移除所有
IplImage、CvMat相关代码,全面使用cv::Mat。 - 更新 dnn 代码:如果使用旧版 dnn 加载模型(如 Caffe 的
.prototxt/.caffemodel),代码通常可以兼容,但推理代码(forward()调用)可能需要调整。 - 模块路径变化:如果使用了
xfeatures2d(SIFT、SURF),需要从opencv_contrib中单独编译。 - 检查旧 API 弃用警告:编译时打开
-Wdeprecated可见弃用警告。
OpenCV 4.0 是一次面向现代 C++ 和深度学习时代的重大升级,性能更强、API 更现代、对神经网络的支持更全面。