我的库目前使用的是OpenCV 2。现在,我正在尝试编译库以使用OpenCV 3。似乎某些头文件已经移动,某些常量已经更名。例如,CV_INTER_LINEAR
在OpenCV 3中未定义。
由于我的库需要在OpenCV 2和3上进行编译和运行,是否有简单的方法来克服这种不兼容性?
我可以更改我的代码,但那样它就不能在OpenCV 2中工作。
cv::INTER_LINEAR
不是在OpenCV 2(头文件imgproc/imgproc.hpp
)和3中都定义的吗?您需要替换一些常量名称,添加一些包含关系,但这并不太难。In OpenCV 3 we write
#include "opencv2/core.hpp"
instead of
#include "opencv2/core/core.hpp"
The old method should also work.
更新
在新的发行候选版本中,据报道他们已经改善了OpenCV 2.4和3.x之间的兼容性。
与OpenCV 2.4的兼容性得到了改善:
- 2.4.11现在包括“opencv2/core.hpp”和其他这样的头文件,除了标准的“opencv2/core/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
编辑:-请参考Antonio的答案。您可以包括兼容性头文件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之间更改enums、标头路径等。请参阅ChangeLog (3)以了解有关向后兼容性的部分。
您可以尝试复制标头,给出数字而不是常量名称,在代码中使用#ifdefs
- 但迟早会失败。我建议维护单独的副本并保持心安。除非我目前处于生产中,否则我宁愿忽略OpenCV 2。
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库进行编译。但是,这会引入很多冗余(可以通过一些聪明的编码避免)。
./modules/imgproc/include/opencv2/imgproc/types_c.h
吗? - lanpa