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中进行,因此不需要以下说明,但建议使用。

替换旧模块头的包含:

OpenCV迁移指南

现代的使用算法的方法

必须使用cv :: makePtr函数或相应的静态工厂方法(如果可用)创建算法实例:

//好方法

OpenCV迁移指南

其他方式已被弃用:

OpenCV迁移指南

应通过相应的虚方法访问算法属性,getSomeProperty / setSomeProperty,删除了通用的get / set方法:

OpenCV迁移指南

删除initModule_<moduleName>()calls

机器学习模块

由于此模块已被重写,因此需要花费一些精力才能使您的软件适应它。所有算法都与其基类StatModel一起位于单独的ml命名空间中。单独的SomeAlgoParams类已被一组相应的getProperty / setProperty方法替换。

下表说明了2.4和3.0机器学习类之间的对应关系。

OpenCV迁移指南

尽管3.0中重写的ml算法允许您从xml / yml文件加载旧的训练模型,但预测过程中的偏差是可能的。

points_classifier.cpp示例中的以下代码片段说明了模型培训过程中的差异:

OpenCV迁移指南

功能检测

一些算法(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. 1. 将opencv_contrib添加到编译过程

  2. 2. 包含opencv2/xfeatures2d.h标题

  3. 3. 使用命名空间 xfeatures2d

  4. 4. 用或替换operator()呼叫detect,compute或者detectAndCompute

有些类现在使用通用方法detect,compute或者detectAndCompute由Feature2D基类而不是自定义提供operator()

以下代码片段说明了差异(来自video_homography.cpp示例):

OpenCV迁移指南

OpenCL

所有专门的ocl实现都隐藏在通用C ++算法接口之后。现在可以在运行时动态选择函数执行路径:CPU或OpenCL; 这种机制也称为“透明API”。

新类cv :: UMat旨在以方便的方式隐藏与OpenCL设备的数据交换。

以下示例说明了API修改(来自OpenCV站点):

OpenCV迁移指南

CUDA

CUDA模块已移至opencv_contrib存储库中。

cuda - CUDA加速计算机视觉

cudaarithm - 矩阵运算

cudabgsegm - 背景分割

cudacodec - 视频编码/解码

cudafeatures2d - 特征检测和描述

cudafilters - 图像过滤

cudaimgproc - 图像处理

cudalegacy - 遗产支持

cudaoptflow - 光流

cudastereo - 立体声通信

cudawarping - 图像变形

cudev - 设备层

文档格式

文档已转换为Doxygen格式。您可以在OpenCV参考文档的教程部分(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迁移指南

至此,OpenCV迁移任务就完成了。

-END-

§ §

蜂口小程序,持续为你带来最新技术的落地方法,还有各种最新行业资讯免费看!,欢迎扫描左下方二维码随时关注了解关注~

想入群?想获得更多优惠?右下方二维码,随时等你来撩!

以上是关于OpenCV迁移指南的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV入门指南第二篇 缩放图像

opencv配置指南

opencv入门指南(转载)

OpenCV入门指南第七篇 线段检测与圆检测

机器视觉行业实践技巧 -- OpenCV技巧与方法:避坑指南

OpenCV DNN 模块-风格迁移