我的库目前使用的是OpenCV 2.现在,我正在尝试编译库以使用OpenCV 3.似乎有些头文件被移动了,一些常量被重命名。例如,OpenCV 3中未定义CV_INTER_LINEAR
。
由于我的库需要在OpenCV 2和3上编译和运行,有没有简单的方法来克服这种不兼容性?
我可以更改我的代码,但它在OpenCV中不起作用2。
答案 0 :(得分:5)
types_c.h
(1)并使用OpenCV 2常量名称,这些名称也适用于OpenCV 3。这是因为,即使常量名称不同(例如INTER_LINEAR
与CV_INTER_LINEAR
),常量值保持不变(2)。因此,接受整数const值的函数在OpenCV 2和3中的行为应该没有区别。对于其他常量也是如此。这样您就必须在OpenCV 2和3之间更改标题路径。
老答案: - 这是不可能的。 OpenCV 3并不完全向后兼容OpenCV 2.您必须在OpenCV 2和3之间更改枚举,标题路径等。有关向后兼容性的部分,请参阅Changelog(3)。
您可以尝试复制标题,给出数字而不是常量名称,在代码中使用#ifdefs
- 但迟早会失败。我建议保留单独的副本,让您高枕无忧。除非我目前正在制作,否则我宁愿完全忽略OpenCV 2.
答案 1 :(得分:5)
几个月前我遇到了同样的问题,我不得不反对Kiran:我有一个相对较大的项目,用OpenCv 2和3构建。能够用2和3构建是非常重要的项目转换阶段,特别是因为OpenCV 3还没有稳定版本,但却具有惊人的优化功能。
OpenCV 2(标题cv::INTER_LINEAR
)和3中是否都定义了imgproc/imgproc.hpp
?你必须更换一些常量名称,添加一些内容,但这不会太难。
关于标题包含,有一种方法可以找到兼容Opencv2和3的包含路径。
在OpenCV 3中我们写
#include "opencv2/core.hpp"
而不是
#include "opencv2/core/core.hpp"
旧方法也应该有效。
的更新强>
在new Release Candidate,it'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风格创建(新的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 :(得分:0)
OpenCV人员已在网上提出过渡指南:http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html
实质上我认为以下内容已经改变: -
对于使用Opencv3和opencv2的代码,我通常会引入一个带有标志的prepocessor指令: -
#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库进行编译。但是,引入了大量冗余(可以通过一些巧妙的编码来避免)。