维护OpenCV 2和OpenCV 3之间的代码兼容性
Maintaining code compatibility between OpenCV 2 and OpenCV 3
我的库当前使用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_LINEAR
与CV_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库进行编译。但是,引入了大量冗余(可以通过一些巧妙的编码来避免)。
- Mingw-64 在构建和安装后不会编译 openCV 代码
- OpenCV代码不会检测人脸的数量,也不会在脸周围放一个圆圈
- 将 OpenCV 2 中的ANN_MLP代码转换为 OpenCV 3 代码
- 使用Bicubic C 的调整大小函数的OPENCV代码流是什么?
- cv:内存位置的异常 - 运行 openCV 代码 Visual Studio 2013 & Visual Studio 2017 - Windows 7
- 使用 Emscripten 将 OpenCV 代码编译C++ Javascript
- 如何在Android中使用OpenCV C 代码
- 想要将此 Matlab 代码转换为 OpenCV 代码
- 如何在Ubuntu 16.04上的Anaconda环境中将OpenCV C 代码与Python代码集成在一起
- 无法解决 opencv 代码中的 malloc 错误
- opencv 代码中的错误:C++
- 任何人都可以向我解释此OPENCV代码的一部分
- 使用MATLAB通过MEX运行OPENCV代码在VisualStudio上可以使用
- 以下使用 OpenCV 代码的C++未编译
- 在c#应用程序中调用opencv c++代码
- Visual如何使用OPENCV(C 代码)访问IP摄像机?有没有一种方法可以使用OpenCV VLC访问?(Win
- 在Visual Studio 2012中运行我的OpenCV代码时无法找出'u202A'警告
- OpenCV C++代码在终端中运行良好,但在从Ubuntu 12.04运行时出错
- 将 c++ opencv 代码更改为 android 代码
- OpenCV代码将存储在列表中的描述符与新的图像描述符进行比较