维护OpenCV 2和OpenCV 3之间的代码兼容性

时间:2015-04-20 14:26:27

标签: c++ opencv opencv3.0

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

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

3 个答案:

答案 0 :(得分:5)

编辑: - 阅读安东尼奥的回答。您可以包含兼容性标头types_c.h1)并使用OpenCV 2常量名称,这些名称也适用于OpenCV 3。这是因为,即使常量名称不同(例如INTER_LINEARCV_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的包含路径。

来自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风格创建(新的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

实质上我认为以下内容已经改变: -

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

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