OpenCV迁移指南
Posted 蜂口知道
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV迁移指南相关的知识,希望对你有一定的参考价值。
概述
本文档面向希望将代码迁移到OpenCV 3.0的软件开发人员。
与版本2.4相比,OpenCV 3.0引入了许多新算法和功能。有些模块已被重写,有些已经重组。尽管2.4中的大多数算法仍然存在,但接口有一些不同。
本节描述了一般性的最显着变化,过渡操作的所有细节和示例都在本文档的下一部分中。
贡献存储库
https://github.com/opencv/opencv_contrib
这是一个适用于所有新算法,实验算法和非免费算法的地方。与主存储库相比,它没有得到支持团队的太多关注,但社区努力使其保持良好状态。
要使用contrib存储库构建OpenCV ,请将以下选项添加到cmake命令:
-DOPENCV_EXTRA_MODULES_PATH = <路径到opencv_contrib> /模块
标题布局
在2.4中,所有头文件都位于相应的模块子文件夹(opencv2 / <module> / <module> .hpp)中,在3.0中有顶级模块头文件,其中包含大部分模块功能:opencv2 / <module> .hpp和all C风格的API定义已移至单独的标头(例如opencv2 / core / core_c.h)。
算法接口
通用算法使用模式已更改:现在必须在包装在智能指针cv :: Ptr中的堆上创建。版本2.4允许直接或通过智能指针进行堆栈和堆分配。
已经从cv :: Algorithm类中删除了get和set方法以及CV_INIT_ALGORITHM宏。在3.0中,所有属性都已转换为getProperty / setProperty纯虚拟方法对。因此,它是不是能够创建和使用CV ::算法通过名称实例(使用通用的算法::创建(字符串)方法),应该显式调用相应的工厂方法。
改变的模块
ml模块已被重写。
highgui模块已被拆分为:imgcodecs,videoio和highgui本身
features2d模块已重组(某些功能检测器已移至opencv_contrib / xfeatures2d模块)
传统的,非自由的模块已被删除。一些算法已被移动到不同的位置,一些算法已被完全重写或删除
CUDA API已更新(gpu模块 - >几个cuda模块,命名空间gpu - >命名空间cuda)
OpenCL API已经改变(ocl模块已被删除,单独的ocl :: implementation - > Transparent API)
其他一些方法和类已被重新定位,本节通过示例介绍具体操作。
准备2.4
最新的2.4.11 OpenCV版本中的一些更改允许您准备当前的代码库以进行迁移:
cv :: makePtr函数现在可用
已创建opencv2 / <module> .hpp标头
新标题布局
注意:旨在简化迁移的更改已在OpenCV 3.0中进行,因此不需要以下说明,但建议使用。
替换旧模块头的包含:
现代的使用算法的方法
必须使用cv :: makePtr函数或相应的静态工厂方法(如果可用)创建算法实例:
//好方法
其他方式已被弃用:
应通过相应的虚方法访问算法属性,getSomeProperty / setSomeProperty,删除了通用的get / set方法:
删除initModule_<moduleName>()calls
机器学习模块
由于此模块已被重写,因此需要花费一些精力才能使您的软件适应它。所有算法都与其基类StatModel一起位于单独的ml命名空间中。单独的SomeAlgoParams类已被一组相应的getProperty / setProperty方法替换。
下表说明了2.4和3.0机器学习类之间的对应关系。
尽管3.0中重写的ml算法允许您从xml / yml文件加载旧的训练模型,但预测过程中的偏差是可能的。
points_classifier.cpp示例中的以下代码片段说明了模型培训过程中的差异:
功能检测
一些算法(FREAK,BRIEF,SIFT,SURF)已移至opencv_contrib存储库,xfeatures2d模块,xfeatures2d命名空间。它们的接口也已更改(从cv::Feature2D基类继承)。
xfeatures2d模块类列表:
cv :: xfeatures2d :: BriefDescriptorExtractor - 用于计算简要描述符的类(2.4位置:features2d)
cv :: xfeatures2d :: FREAK - 实现FREAK(快速视网膜关键点)关键点描述符的类(2.4位置:features2d)
cv :: xfeatures2d :: StarDetector - 该类实现CenSurE检测器(2.4位置:features2d)
cv :: xfeatures2d :: SIFT - 使用Scale Invariant Feature Transform(SIFT)算法提取关键点和计算描述符的类(2.4位置:nonfree)
cv :: xfeatures2d :: SURF - 从图像中提取Speeded Up Robust功能的类(2.4位置:nonfree)
需要以下步骤:
1. 将opencv_contrib添加到编译过程
2. 包含opencv2/xfeatures2d.h标题
3. 使用命名空间 xfeatures2d
4. 用或替换operator()呼叫detect,compute或者detectAndCompute
有些类现在使用通用方法detect,compute或者detectAndCompute由Feature2D基类而不是自定义提供operator()
以下代码片段说明了差异(来自video_homography.cpp示例):
OpenCL
所有专门的ocl实现都隐藏在通用C ++算法接口之后。现在可以在运行时动态选择函数执行路径:CPU或OpenCL; 这种机制也称为“透明API”。
新类cv :: UMat旨在以方便的方式隐藏与OpenCL设备的数据交换。
以下示例说明了API修改(来自OpenCV站点):
CUDA
CUDA模块已移至opencv_contrib存储库中。
cuda - CUDA加速计算机视觉
cudaarithm - 矩阵运算
cudabgsegm - 背景分割
cudacodec - 视频编码/解码
cudafeatures2d - 特征检测和描述
cudafilters - 图像过滤
cudaimgproc - 图像处理
cudalegacy - 遗产支持
cudaoptflow - 光流
cudastereo - 立体声通信
cudawarping - 图像变形
cudev - 设备层
文档格式
文档已转换为Doxygen格式。您可以在OpenCV参考文档的教程部分(OpenCV的编写文档)中找到更新的文档编写指南。
支持两个版本
在某些情况下,可以支持两种版本的OpenCV。
源代码
要检查应用程序源代码中的库主要版本,应使用以下方法:
注意
不要使用CV_VERSION_MAJOR,它对2.4和3.x分支有不同的含义!
构建系统
通过检查构建系统中的库版本,可以链接不同的模块或启用/禁用应用程序中的某些功能。标准的cmake或pkg-config变量可用于此:
OpenCV_VERSION 对于cmake,将包含完整版本:例如“2.4.11”或“3.0.0”
OpenCV_VERSION_MAJOR 对于cmake,将仅包含主要版本号:2或3
pkg-config文件有标准字段 Version
例:
至此,OpenCV迁移任务就完成了。
-END-
蜂口小程序,持续为你带来最新技术的落地方法,还有各种最新行业资讯免费看!,欢迎扫描左下方二维码随时关注了解关注~
想入群?想获得更多优惠?右下方二维码,随时等你来撩!
以上是关于OpenCV迁移指南的主要内容,如果未能解决你的问题,请参考以下文章