OpenCV 5.0 是自 2018 年发布 OpenCV 4 以来最大的一次主版本重大升级。与 OpenCV 4.8 相比,OpenCV 5.0 在深度学习引擎、底层语言标准、架构拆分、数据类型支持等方面进行了全面革新。涉及的核心升级内容如下:
- 颠覆性的全新 DNN 推理引擎
OpenCV 4.8: 其 DNN 模块在面对现代复杂的神经网络时,由于不支持动态形状(Dynamic Shapes)和新型 Transformer 算子,开发者往往需要依赖 PyTorch 或 ONNX Runtime 来进行模型推理。
• OpenCV 5.0: 新引擎围绕"类型化操作图(Typed Operation Graph)"构建,在执行前会处理整个网络图,完美解决了动态 Shape 的痛点。CPU 推理性能大幅飞跃,官方测试其速度已能比肩甚至超越微软的 ONNX Runtime。
- 多引擎容错机制 (DNN API)
为了防止旧代码崩溃,OpenCV 5.0 的 readNet 引入了多引擎切换机制:
• ENGINE_NEW:强制使用支持动态图的新图引擎(目前仅跑 CPU)。
• ENGINE_CLASSIC:强制使用 4.x 风格的经典引擎(如果需要使用 CUDA / OpenVINO 加速,必须切回此引擎)。
• ENGINE_AUTO:默认选项。优先使用全新引擎,如果遇到不支持的算子,自动无缝回退到经典引擎。
- 模块架构大重组 (Migration)
为了让库更加轻量和现代,5.0 对模块进行了拆分和精简:
• 拆分 calib3d 模块: 将原本庞大的相机标定与三维重建模块,细拆为 geometry、calib、stereo 和 ptcloud(点云)四个独立模块。
• 重命名: features2d 简写重命名为 features。
• 精简核心: 传统的机器学习模块(ml)、传统的 Haar/HOG 级联检测器、以及 gapi 均被移出核心库,归入到 opencv_contrib 扩展库中。
• 移除过时解析器: 彻底删除了 Darknet(YOLOv3/v4 旧版框架)和 Caffe 模型的原生解析器。
4.核心模块拆分与重命名(最影响 #include 的变化)
OpenCV 5.0 彻底打破了旧有的 monolithic(单体化)大模块,将其细化拆分,导致大量常用函数的头文件路径发生改变:
• calib3d 模块被彻底拆分: 4.8 中包含相机标定、立体匹配、3D 几何的所有东西都在 opencv2/calib3d.hpp 中,5.0 彻底取消了该大头文件,拆分为:
• #include <opencv2/calib.hpp>:存放相机标定函数(如 calibrateCamera 等)。
• #include <opencv2/geometry.hpp> :存放 3D/2D 几何计算(如 findHomography, solvePnP, estimateAffine2D 等)。
• #include <opencv2/stereo.hpp>:存放立体视觉与深度计算(如 StereoBM, StereoSGBM 等)。
• #include <opencv2/ptcloud.hpp>(或 3d.hpp):存放点云 I/O、TSDF 以及基础 3D 视觉算法。
• features2d 模块重命名:
旧:#include <opencv2/features2d.hpp>
新:#include <opencv2/features.hpp> (去掉了末尾的 2d)
imgproc 模块的部分几何函数外迁:
• 凸包计算 convexHull、德洛内三角剖分 Delaunay 等计算几何函数,从 opencv2/imgproc.hpp 迁移到了新的 opencv2/geometry.hpp 中。