![]() |
OpenCV 4.12.0
开源计算机视觉
|
上一个教程: 为 OpenCV 编写文档
下一个教程: 从其他 Doxygen 项目交叉引用 OpenCV
| 原始作者 | 马克西姆·沙布宁 |
| 兼容性 | OpenCV >= 3.0 |
本文档旨在帮助希望将其代码迁移到 OpenCV 3.0 的软件开发人员。
与 2.4 版本相比,OpenCV 3.0 引入了许多新算法和功能。一些模块已被重写,一些已被重组。尽管 2.4 中的大多数算法仍然存在,但接口可能有所不同。
本节概述了最显著的变更,所有详细信息和迁移操作示例将在文档的下一部分中介绍。
https://github.com/opencv/opencv_contrib
这里是所有新的、实验性的和非免费算法的存放地。与主仓库相比,它没有得到支持团队那么多的关注,但社区会努力维护它。
要使用 contrib 仓库构建 OpenCV,请将以下选项添加到您的 cmake 命令中
在 2.4 版本中,所有头文件都位于相应的模块子文件夹中(opencv2/<module>/<module>.hpp),而在 3.0 版本中,存在包含大部分模块功能的顶级模块头文件:opencv2/<module>.hpp,并且所有 C 风格的 API 定义已移至单独的头文件(例如 opencv2/core/core_c.h)。
通用算法使用模式已更改:现在必须在堆上创建并封装在智能指针 cv::Ptr 中。2.4 版本允许栈分配和堆分配,无论是直接分配还是通过智能指针。
get 和 set 方法以及 CV_INIT_ALGORITHM 宏已从 cv::Algorithm 类中移除。在 3.0 版本中,所有属性都已转换为 getProperty/setProperty 纯虚方法对。因此,无法通过名称(使用通用 Algorithm::create(String) 方法)创建和使用 cv::Algorithm 实例,而应显式调用相应的工厂方法。
本节将通过示例描述具体操作。
OpenCV 最新 2.4.11 版本中的一些更改允许您为迁移准备当前代码库
注意: OpenCV 3.0 中已进行了旨在简化迁移的更改,因此以下说明并非必需,但建议遵循。
initModule_<moduleName>() 调用由于此模块已被重写,因此您的软件需要进行一些适配工作。所有算法都位于独立的 ml 命名空间中,以及它们的基类 StatModel。独立的 SomeAlgoParams 类已被替换为相应的 getProperty/setProperty 方法集。
下表说明了 2.4 和 3.0 机器学习类之间的对应关系。
| 2.4 | 3.0 |
|---|---|
| CvStatModel | cv::ml::StatModel |
| CvNormalBayesClassifier | cv::ml::NormalBayesClassifier |
| CvKNearest | cv::ml::KNearest |
| CvSVM | cv::ml::SVM |
| CvDTree | cv::ml::DTrees |
| CvBoost | cv::ml::Boost |
| CvGBTrees | 未实现 |
| CvRTrees | cv::ml::RTrees |
| CvERTrees | 未实现 |
| EM | cv::ml::EM |
| CvANN_MLP | cv::ml::ANN_MLP |
| 未实现 | cv::ml::LogisticRegression |
| CvMLData | cv::ml::TrainData |
尽管 3.0 中重写的 ml 算法允许您从 xml/yml 文件加载旧的训练模型,但预测过程中可能会出现偏差。
以下来自 points_classifier.cpp 示例的代码片段说明了模型训练过程中的差异
一些算法(FREAK、BRIEF、SIFT、SURF)已移至 opencv_contrib 仓库中的 xfeatures2d 模块,位于 xfeatures2d 命名空间下。它们的接口也已更改(继承自 cv::Feature2D 基类)。
xfeatures2d 模块类列表
需要以下步骤
opencv2/xfeatures2d.h 头文件xfeatures2doperator() 调用替换为 detect、compute 或 detectAndCompute现在,一些类使用 Feature2D 基类提供的通用方法 detect、compute 或 detectAndCompute,而不是自定义的 operator()
以下代码片段说明了差异(来自 video_homography.cpp 示例)
所有专门的 ocl 实现都已隐藏在通用 C++ 算法接口之后。现在,函数执行路径可以在运行时动态选择:CPU 或 OpenCL;这种机制也称为“透明 API”。
新类 cv::UMat 旨在以便捷的方式隐藏与 OpenCL 设备的数据交换。
以下示例说明了 API 修改(摘自 OpenCV 网站)
CUDA 模块已移至 opencv_contrib 仓库。
文档已转换为 Doxygen 格式。您可以在 OpenCV 参考文档的 教程 部分找到更新的文档编写指南(为 OpenCV 编写文档)。
在某些情况下,可以同时支持 OpenCV 的两个版本。
要在应用程序源代码中检查库的主版本,应使用以下方法
通过在构建系统中检查库版本,可以在应用程序中链接不同的模块或启用/禁用某些功能。标准 cmake 或 pkg-config 变量可用于此目的
OpenCV_VERSION 将包含完整版本号,例如 "2.4.11" 或 "3.0.0"OpenCV_VERSION_MAJOR 将只包含主版本号:2 或 3Version示例