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

Maintaining code compatibility between OpenCV 2 and OpenCV 3

本文关键字:OpenCV 代码 兼容性 之间 维护      更新时间:2023-10-16

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

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

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

cv::INTER_LINEAR不是在OpenCV 2(标头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:的兼容性

  • 2.4.11现在包括"opencv2/core.hpp"和除标准"opencv2/core/hpp"之外的其他此类标头
  • 智能指针(Ptr<>)现在可以在2.4和3.0样式中创建(新的ClassName(params)vsmakePtr(params))
  • 从opencv_ml 3.0现在可以按原样加载和使用opencv.ml 2.4
  • 2.4=>3.0过渡导轨已绘制:http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html

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

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

您可以尝试复制标题,给出数字而不是常量名称,在整个代码中使用#ifdefs,但这迟早会失败。我建议单独保存副本,并保持心态平和。我宁愿完全忽略OpenCV2,除非我目前正在生产中。

OpenCV的人在网上发布了一份过渡指南:http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html

从本质上讲,我认为以下内容已经发生了变化:-

  • ml模块->StatModel在OpenCV3中的存在,它是所有分类器的根
  • features2d和xfeatures2d->SIFT和其他一些功能已经从核心存储库转移到opencv_controib repo
  • 还有很多我不知道的

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