保持 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 兼容的包含路径。
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库进行编译。但是,引入了很多冗余(可以通过一些巧妙的编码来避免)。
我的库目前使用 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 兼容的包含路径。
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库进行编译。但是,引入了很多冗余(可以通过一些巧妙的编码来避免)。