8

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

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

4

3 回答 3

5

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

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

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

于 2015-04-20T15:09:10.947 回答
5

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

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

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

Kiran 发布的链接

在 OpenCV 3 中,我们写

#include "opencv2/core.hpp"

代替

#include "opencv2/core/core.hpp"

旧方法也应该有效。


更新
新的候选版本中,据报道他们提高了 OpenCV 2.4 和 3.x 之间的兼容性

改进了与 OpenCV 2.4 的兼容性:

  • 除了标准的“opencv2/core/core.hpp”之外,2.4.11 现在还包括“opencv2/core.hpp”和其他此类头文件。
  • 现在可以在 2.4 和 3.0 样式中创建智能指针 (Ptr<>) (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
于 2015-04-20T19:28:54.990 回答
0

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 库进行编译。但是,引入了很多冗余(可以通过一些巧妙的编码来避免)。

于 2015-05-07T15:05:19.023 回答