我的库目前使用 OpenCV 2。现在,我正在尝试编译库以使用 OpenCV 3。似乎一些头文件被移动了,一些常量被重命名了。例如,CV_INTER_LINEAR
在 OpenCV 3 中没有定义。
由于我的库需要在 OpenCV 2 和 3 上编译和运行,有没有什么简单的方法可以克服这种不兼容性?
我可以更改我的代码,但它在 OpenCV 2 中不起作用。
编辑:-阅读安东尼奥的答案。您可以包含兼容性标头types_c.h
( 1 ) 并使用在 OpenCV 3 中也可以使用的 OpenCV 2 常量名称。这是因为,即使常量名称不同(例如INTER_LINEAR
vs CV_INTER_LINEAR
),常量值保持不变(2)。因此,接受整数 const 值的函数在 OpenCV 2 和 3 中的行为应该没有什么不同。其他常量也是如此。这样,您只需更改 OpenCV 2 和 3 之间的标头路径。
旧答案:- 这是不可能的。OpenCV 3 与 OpenCV 2 不完全向后兼容。您必须在 OpenCV 2 和 3 之间更改枚举、标头路径等。有关向后兼容性的部分,请参阅 Changelog( 3 )。
您可以尝试复制标题,提供数字而不是常量名称,使用#ifdefs
整个代码 -但迟早会失败。我建议保留单独的副本并高枕无忧。除非我目前正在生产中,否则我宁愿完全忽略 OpenCV 2。
几个月前我遇到了同样的问题,我不得不反驳 Kiran:我的相对较大的项目是使用 OpenCv 2 和 3 构建的。能够同时使用 2 和 3 构建在项目过渡阶段非常重要,尤其是因为 OpenCV 3 还不是稳定版本,但具有惊人的优化功能。
不是cv::INTER_LINEAR
在 OpenCV 2(header imgproc/imgproc.hpp
)和 3 中都定义了吗?您必须替换一些常量名称,添加一些包含,但这不会太难。
关于标头包含,有一种方法可以找到兼容 Opencv2 和 3 的包含路径。
在 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
OpenCV 家伙已经在网上发布了一个过渡指南:http: //docs.opencv.org/master/db/dfa/tutorial_transition_guide.html
从本质上讲,我认为以下内容发生了变化:-
至于使用 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 库进行编译。但是,引入了很多冗余(可以通过一些巧妙的编码来避免)。