保持 OpenCV 2 和 OpenCV 3 之间的代码兼容性

Maintaining code compatibility between OpenCV 2 and OpenCV 3

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

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

编辑:- 阅读安东尼奥的回答。您可以包括兼容性 header types_c.h(1) and use OpenCV 2 constant names which works in OpenCV 3 also. This is since, even though constant names differ (e.g. INTER_LINEAR vs CV_INTER_LINEAR), constant values remain the same(2)。因此,接受整数 const 值的函数在 OpenCV 2 和 3 中的行为应该没有什么不同。其他常量也是如此。这样你只需要改变 OpenCV 2 和 3 之间的 header 路径。

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

您可以尝试复制 header 之类的东西,给出数字而不是常量名称,在整个代码中使用 #ifdefs - 但迟早会失败。我建议维护单独的副本并高枕无忧。除非我目前正在生产中,否则我宁愿完全忽略 OpenCV 2。

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

OpenCV 2 (header imgproc/imgproc.hpp) 和 3 中不是都定义了 cv::INTER_LINEAR 吗?您必须替换一些常量名称,添加一些包含物,但这不会太难。

关于 header 包含,有一种方法可以找到与 Opencv2 和 3 兼容的包含路径。

来自link Kiran posted

In OpenCV 3 we write

#include "opencv2/core.hpp"

instead of

#include "opencv2/core/core.hpp"

The old method should also work.


更新
new Release Candidate, it's reported 他们改进了 OpenCV 2.4 和 3.x

之间的兼容性

Improved compatibility with OpenCV 2.4:

  • 2.4.11 now includes "opencv2/core.hpp" and other such headers in addition to standard "opencv2/core/core.hpp".
  • smart pointers (Ptr<>) can now be created in both 2.4 and 3.0 style (new ClassName(params) vs makePtr(params))
  • trained and stored stat models from opencv_ml 2.4 can now be loaded and used by opencv_ml 3.0 as-is.
  • the 2.4=>3.0 transition guide has been sketched: http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html

OpenCV 人员在线发布了转换指南:http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html

本质上我认为有以下变化:-

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

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