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

8

我的库目前使用的是OpenCV 2。现在,我正在尝试编译库以使用OpenCV 3。似乎某些头文件已经移动,某些常量已经更名。例如,CV_INTER_LINEAR 在OpenCV 3中未定义。

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


你好,你有检查过 ./modules/imgproc/include/opencv2/imgproc/types_c.h 吗? - lanpa
3个回答

5
我几个月前遇到同样的问题,必须反驳Kiran:我成功构建了一个相对较大的项目,既使用了OpenCv 2也使用了3。在项目转换阶段能够同时使用2和3非常重要,特别是因为OpenCV 3目前还没有稳定版,但具有惊人的优化功能。
难道cv::INTER_LINEAR不是在OpenCV 2(头文件imgproc/imgproc.hpp)和3中都定义的吗?您需要替换一些常量名称,添加一些包含关系,但这并不太难。
至于头文件包含方面,有一种方法可以找到适用于Opencv2和3的包含路径。
Kiran发布的链接中:

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

5

编辑:-请参考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开发人员的不好之处。他们应该有一种方法来维护为V2编写的代码,并使其与V3兼容。 - mans
2
如果每个库开发者都这么想,我们仍然会使用OpenGL 1。更多的是规范。 - kiranpradeep

0

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库进行编译。但是,这会引入很多冗余(可以通过一些聪明的编码避免)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接