【问题标题】:Maintaining code compatibility between OpenCV 2 and OpenCV 3保持 OpenCV 2 和 OpenCV 3 之间的代码兼容性
【发布时间】:2015-06-27 08:09:09
【问题描述】:

我的库当前使用 OpenCV 2。现在,我正在尝试编译库以使用 OpenCV 3。似乎一些头文件被移动,一些常量被重命名。例如,CV_INTER_LINEAR 未在 OpenCV 3 中定义。

由于我的库需要在 OpenCV 2 和 3 上编译和运行,有没有什么简单的方法可以克服这种不兼容性?
我可以更改我的代码,但它在 OpenCV 2 中不起作用。

【问题讨论】:

  • 嗨,你检查过./modules/imgproc/include/opencv2/imgproc/types_c.h吗?

标签: c++ opencv opencv3.0


【解决方案1】:

几个月前我遇到了同样的问题,我不得不反驳 Kiran:我的相对较大的项目是使用 OpenCv 2 和 3 构建的。能够同时使用 2 和 3 构建在项目中非常重要过渡阶段,特别是因为 OpenCV 3 还不是稳定版本,但具有惊人的优化功能。

cv::INTER_LINEAR 不是在 OpenCV 2(标头 imgproc/imgproc.hpp)和 3 中都定义了吗?您必须替换一些常量名称,添加一些包含,但这不会太难。

关于头文件包含,有一种方法可以找到兼容 Opencv2 和 3 的包含路径。

来自link Kiran posted

在 OpenCV 3 中我们编写

#include "opencv2/core.hpp"

而不是

#include "opencv2/core/core.hpp"

旧方法也应该有效。


更新
new Release Candidateit's reported 中,它们改进了 OpenCV 2.4 和 3.x 之间的兼容性

改进了与 OpenCV 2.4 的兼容性:

  • 2.4.11 除了标准的“opencv2/core/core.hpp”之外,现在还包括“opencv2/core.hpp”和其他此类头文件。
  • 智能指针(Ptr) 现在可以在 2.4 和 3.0 样式中创建(new ClassName(params) vs makePtr(params))
  • 训练和存储的统计模型来自 opencv_ml 2.4 现在可以按原样加载并由 opencv_ml 3.0 使用。
  • 2.4=>3.0 过渡指南已草绘:http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html

【讨论】:

    【解决方案2】:

    编辑:- 阅读安东尼奥的回答。您可以包含兼容性标头types_c.h(1) 并使用在 OpenCV 3 中也可以使用的 OpenCV 2 常量名称。这是因为,即使常量名称不同(例如 INTER_LINEARCV_INTER_LINEAR),常量 保持不变(2)。因此,接受整数 const 值的函数在 OpenCV 2 和 3 中的行为应该没有什么不同。其他常量也是如此。这样,您只需更改 OpenCV 2 和 3 之间的标头路径。

    旧答案:- 这是不可能的。 OpenCV 3 与 OpenCV 2 不完全向后兼容。您必须在 OpenCV 2 和 3 之间更改枚举、标头路径等。有关向后兼容性的部分,请参阅 Changelog(3)。

    您可以尝试复制标头,提供数字而不是常量名称,在代码中使用#ifdefs - 但迟早会失败。我建议保留单独的副本并高枕无忧。除非我目前正在生产中,否则我宁愿完全忽略 OpenCV 2。

    【讨论】:

    • 谢谢,但这对 opencv 开发人员来说很糟糕。他们应该有办法维护为 V2 编写的代码并使它们与 V3 兼容。
    • @mans 如果每个库开发人员都这么认为,我们仍然会使用 OpenGL 1。更多的是规范。
    【解决方案3】:

    OpenCV 的人已经在网上发布了一个转换指南:http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html

    本质上我认为以下内容发生了变化:-

    • ml 模块-> OpenCV 3 中存在 StatModel,它是所有分类器的根。
    • features2d 和 xfeatures2d -> SIFT 和其他几个已从核心存储库转移到 opencv_contrib 存储库
    • 还有许多我不知道的人

    至于使用 Opencv3 和 opencv2 的代码,我通常会引入一个带有标志的前处理器指令:-

    #define HAS_OPENCV3 1
    #ifdef HAS_OPENCV3
    #include <opencv2/core.hpp> //Any OPENCV3 code
    #else
    #include <opencv2/core/core.hpp> //Any Opencv2 code
    #endif
    

    由于相关部分在编译之前已被消除,因此它也将仅使用 OpenCV2 或 OpenCV3 库进行编译。但是,引入了很多冗余(可以通过一些巧妙的编码来避免)。

    【讨论】:

      猜你喜欢
      • 2017-01-21
      • 1970-01-01
      • 2011-05-13
      • 2023-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      相关资源
      最近更新 更多