OpenCV从2到3的过渡

news2024/12/24 8:13:21

与版本2.4相比,OpenCV 3.0引入了许多新算法和功能。有些模块已被重写,有些已经重组。尽管2.4中的大多数算法仍然存在,但接口可能不同。本节描述了一般性的最显着变化,过渡操作的所有细节和示例都在本文档的下一部分中。

1、贡献存储库

 https://github.com/opencv/opencv_contrib

这是一个适用于所有新算法,实验算法和非免费算法的地方。与主存储库相比,它没有得到支持团队的太多关注,但社区努力使其保持良好状态。(即OpenCV的附加库,人脸识别等一些附加的功能可能需要用到这个库)

要使用contrib存储库构建OpenCV ,请将以下选项添加到cmake命令:

-DOPENCV_EXTRA_MODULES_PATH=<path-to-opencv_contrib>/modules

或者参考我的博客为opencv添加contrib库。

2、头文件布局

  在2.4中,所有头文件都位于相应的模块子文件夹(opencv2 / <module> / <module> .hpp)中,在3.0中有顶级模块头文件,其中包含大部分模块功能:opencv2 / <module> .hpp和所有 C语言风格的API定义已移至单独的标头(例如opencv2 / core / core_c.h)。

3、算法接口

  通用算法使用模式已更改:现在必须在包装在智能指针cv :: Ptr中的堆上创建。版本2.4允许直接或通过智能指针进行堆栈和堆分配。

  已经从cv :: Algorithm类中删除了getset方法以及CV_INIT_ALGORITHM宏。在3.0中,所有属性都已转换为getProperty / setProperty纯虚拟方法对。因此,它是不是能够创建和使用CV ::算法通过名称实例(使用通用的算法::创建(字符串)方法),应该显式调用相应的函数方法。

4、重写了模块

  • ml模块已被重写
  • highgui模块已被拆分为:imgcodecsvideoiohighgui本身
  • features2d模块已重组(某些功能检测器已移至opencv_contrib / xfeatures2d模块)
  • 传统的非自由的模块已被删除。一些算法已被移动到不同的位置,一些算法已被完全重写或删除
  • CUDA API已更新(gpu模块 - >几个cuda模块,命名空间gpu - >命名空间cuda
  • OpenCL API已经改变(ocl模块已被删除,单独的ocl :: implementation - > Transparent API)
  • 其他一些方法和类已被重新定位

5、机器学习模块

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

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

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

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

using namespace cv;
// ======== version 2.4 ========
Mat trainSamples, trainClasses;
prepare_train_data( trainSamples, trainClasses );
CvBoost  boost;
Mat var_types( 1, trainSamples.cols + 1, CV_8UC1, Scalar(CV_VAR_ORDERED) );
var_types.at<uchar>( trainSamples.cols ) = CV_VAR_CATEGORICAL;
CvBoostParams  params( CvBoost::DISCRETE, // boost_type
                       100, // weak_count
                       0.95, // weight_trim_rate
                       2, // max_depth
                       false, //use_surrogates
                       0 // priors
                     );
boost.train( trainSamples, CV_ROW_SAMPLE, trainClasses, Mat(), Mat(), var_types, Mat(), params );
// ======== version 3.0 ========
Ptr<Boost> boost = Boost::create();
boost->setBoostType(Boost::DISCRETE);
boost->setWeakCount(100);
boost->setWeightTrimRate(0.95);
boost->setMaxDepth(2);
boost->setUseSurrogates(false);
boost->setPriors(Mat());
boost->train(prepare_train_data()); // 'prepare_train_data' returns an instance of ml::TrainData class

6、功能检测

一些算法(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()呼叫detectcompute或者detectAndCompute如果需要

有些类现在使用通用方法detectcompute或者detectAndComputeFeature2D基类而不是自定义提供operator()

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

using namespace cv;
// ====== 2.4 =======
#include "opencv2/features2d/features2d.hpp"
BriefDescriptorExtractor brief(32);
GridAdaptedFeatureDetector detector(new FastFeatureDetector(10, true), DESIRED_FTRS, 4, 4);
// ...
detector.detect(gray, query_kpts); //Find interest points
brief.compute(gray, query_kpts, query_desc); //Compute brief descriptors at each keypoint location
// ====== 3.0 =======
#include "opencv2/features2d.hpp"
#include "opencv2/xfeatures2d.hpp"
using namespace cv::xfeatures2d;
Ptr<BriefDescriptorExtractor> brief = BriefDescriptorExtractor::create(32);
Ptr<FastFeatureDetector> detector = FastFeatureDetector::create(10, true);
// ...
detector->detect(gray, query_kpts); //Find interest points
brief->compute(gray, query_kpts, query_desc); //Compute brief descriptors at each keypoint location

7、OpenCL

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

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

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

  • OpenCL感知代码OpenCV-2.x
// initialization
VideoCapture vcap(...);
ocl::OclCascadeClassifier fd("haar_ff.xml");
ocl::oclMat frame, frameGray;
Mat frameCpu;
vector<Rect> faces;
for(;;){
    // processing loop
    vcap >> frameCpu;
    frame = frameCpu;
    ocl::cvtColor(frame, frameGray, BGR2GRAY);
    ocl::equalizeHist(frameGray, frameGray);
    fd.detectMultiScale(frameGray, faces, ...);
    // draw rectangles …
    // show image …
}
  • OpenCL感知代码OpenCV-3.x
// initialization
VideoCapture vcap(...);
CascadeClassifier fd("haar_ff.xml");
UMat frame, frameGray; // the only change from plain CPU version
vector<Rect> faces;
for(;;){
    // processing loop
    vcap >> frame;
    cvtColor(frame, frameGray, BGR2GRAY);
    equalizeHist(frameGray, frameGray);
    fd.detectMultiScale(frameGray, faces, ...);
    // draw rectangles …
    // show image …
}

8、cuda

cuda模块已分成几个小块:

  • cuda - CUDA加速计算机视觉
  • cudaarithm - 矩阵运算
  • cudabgsegm - 背景分割
  • cudacodec - 视频编码/解码
  • cudafeatures2d - 特征检测和描述
  • cudafilters - 图像过滤
  • cudaimgproc - 图像处理
  • cudalegacy - 遗产支持
  • cudaoptflow - 光流
  • cudastereo - 立体声通信
  • cudawarping - 图像变形
  • cudev - 设备层

gpu命名空间已被删除,请改用cv :: cuda命名空间。许多类也已重命名,例如:

  • gpu::FAST_GPU- > cv :: cuda :: FastFeatureDetector
  • gpu::createBoxFilter_GPU- > cv :: cuda :: createBoxFilter

9、文档格式

文档已转换为Doxygen格式。您可以在OpenCV参考文档的教程部分(OpenCV的编写文档)中找到更新的文档编写指南。

10、支持两个版本

在某些情况下,可以支持两种版本的OpenCV。

11、源代码版本检测

要检查应用程序源代码中的库主要版本,应使用以下方法:

#include "opencv2/core/version.hpp"
#if CV_MAJOR_VERSION == 2
// do opencv 2 code
#elif CV_MAJOR_VERSION == 3
// do opencv 3 code
#endif

注意不要使用CV_VERSION_MAJOR,它对2.4和3.x分支有不同的含义!

12、编译系统

通过检查编译系统中的库版本,可以链接不同的模块或启用/禁用应用程序中的某些功能。标准的cmake或pkg-config变量可用于此:

  • OpenCV_VERSION 对于cmake,将包含完整版本:例如“2.4.11”或“3.0.0”
  • OpenCV_VERSION_MAJOR 对于cmake,将仅包含主要版本号:2或3
  • pkg-config文件有标准字段 Version

例:

if(OpenCV_VERSION VERSION_LESS "3.0")
# use 2.4 modules
else()
# use 3.x modules
endif()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64030.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nginx安装与配置反向代理

Nginx (engine x) 是一款基于异步框架的轻量级/高性能的Web 服务器/反向代理服务器/缓存服务器/电子邮件(IMAP/POP3)代理服务器,由俄罗斯的程序设计师Igor Sysoev(伊戈尔赛索耶夫)所开发.话不多说直接上步骤 1.安装nginx,我是在root用户下不需要加sudo yum install nginx 安…

嵌入式分享合集116

一、DC-DC升压电路模块原理 DC-DC 转换器是一种电力电子电路&#xff0c;可有效地将直流电从一个电压转换为另一个电压。 DC-DC 转换器在现代电子产品中扮演着不可或缺的角色。这是因为与线性稳压器相比&#xff0c;它们具有多项优势。尤其是线性稳压器会散发大量热量&#x…

什么是天气预报 API 接口?如何获取天气预报 API?

什么是天气预报API接口&#xff1f; 天气的好坏和人们的生活、工作息息相关&#xff0c;每天的天气如何&#xff1f;总是牵动着人们的心&#xff0c;关注天气就行了人们茶余饭后的话题了。如何获得准确的天气预报&#xff1f;还得从天气预报API接口说起。 天气预报API是提供未…

150398-22-4,三肽Phe-Arg-Arg

The tripeptide FRR was found to exert a Zn⁺ dependent, insulin-mimetic inhibitory action on myocardial proteolysis. 三肽FRR对心肌蛋白水解具有Zn⁺依赖性、胰岛素样抑制作用。 编号: 197811中文名称: 三肽Phe-Arg-Arg英文名: Phe-Arg-ArgCAS号: 150398-22-4单字母: H…

yolov1 论文精读 - You Only Look Once

YOLOv1 Introduction 作者将目标检测进行重构并看作为单一的回归问题&#xff0c;直接从图像到边界框坐标和类别概率。使用我们的系统&#xff0c;您只需要在图像上看一次&#xff08;you only look once, YOLO&#xff09;&#xff0c;以预测出现的目标和位置。 系统将输入…

SpringMVC(九):作用域传参

文章目录 作用域传参 一、传统方式传递数据 二、使用Model传递数据

PHP反序列化与SESSION

php存储session的三种模式php_serialize&#xff08;php>5.5.4&#xff09; 经过serialize()函数序列化数组 php 键名竖线经过seralize()序列处理的值 php_biary 键名的长度对应ASCII字符键名serialize()序列化的值 测试代码 <?php //ini_set("sessi…

cubeIDE开发,在LCD显示摄像头抓取的图片数据

一、摄像头相关资料信息 在LCD上显示当前camera的图像数据&#xff0c;类似我们前面提到的LCD显示图片数据&#xff0c;就是实时将摄像头抓取的视频数据帧&#xff08;图片&#xff09;转换成图片字码表&#xff0c;即LCD宽*LCD高像素大小的颜色点阵&#xff0c;然后推送到LCD接…

(三) Spring Security Oauth2.0 源码分析--认证中心全流程分析

一 引言 Spring Security Oauth2.0 的认证中心可以简单的理解为是对Spring Security的加强,也是通过FilterChainProxy(其原理可参考前面的Security源码分析)对客户端进行校验后在达到自定义token颁发站点,进行token的颁发,具体流程如下: 用户发起token申请请求(‘/oauth/to…

ARM异常处理(4):SVC和PendSV的作用详解

SVC(Supervisor Call)和PendSV(Pendable Service Call)是针对软件和操作系统的两个异常。 1 SVC SVC用于生成系统函数调用&#xff0c;例如&#xff0c;用户程序不允许直接访问硬件&#xff0c;操作系统可以通过SVC提供对硬件的访问。因此&#xff0c;当用户程序想要使用某些…

STC 51单片机56——摇摇棒

主要代码&#xff1a; //增减图像时&#xff0c;需要修改 switch_show&#xff08;&#xff09;和 H对应参数 //所用单片机&#xff1a;STC15W408S 内部Rc 11.0592MHz #include <STC15.H> #include <intrins.h> #define POSITIVE 0 #define OPPOSE 1 //sbi…

Vector-常用CAN工具 - CANoe入门到精通_02

​咱们话接上回&#xff0c;前面已经介绍了CANoe的基本信息和硬件环境搭建&#xff0c;下面我们就要打开CANoe&#xff0c;配置CANoe工程了&#xff0c;只有完成了CANoe工程配置才能真正的使用CANoe完成测试&#xff0c;本次主要介绍的是手工测试环境&#xff0c;至于自动化测试…

[附源码]Python计算机毕业设计SSM教师职称评定系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【OpenCV学习】第5课:图像模糊(均值滤波,高斯滤波)

参考文章链接:https://blog.csdn.net/qq_30460949/article/details/121990114 仅自学做笔记用,后续有错误会更改 理论 1.Smooth/blur是图像处理中最简单和常用的操作之一 2.使用该操作的原因之一就是为了给图像预处理的时候减低噪声 3.使用Smooth/Blur操作其背后是数学的卷积…

ContentProvider与ContentResolver

目录&#xff1a;一、什么是ContentProvider&#xff1a;二、如何使用ContentProvider&#xff1a;第一步.创建类继承ContentProvider&#xff1a;第二步.注册ContentProvider&#xff1a;三、URI&#xff1a;1.常用方法&#xff1a;2.解析URI&#xff1a;&#xff08;1&#x…

Android Gradle 学习笔记(二)环境安装

1. 官网安装 Gradle 安装地址&#xff1a;Gradle | Installation 最新的 Gradle 版本是 7.6&#xff0c; 需要 Java 8及以上的版本支持&#xff0c;官网有两种版本可下载&#xff1a; 二进制版本完全版本&#xff08;源码 文档&#xff09; 一般情况下&#xff0c;下载二进…

助力企业降本增效,「WorkPlus SE专业版」正式发布!

移动互联网时代&#xff0c;数字化成为了企业提质降本增效的价值路径。大中小型企业积极主动地借助各种在线办公产品&#xff0c;实现沟通协作和运营管理的优化升级。 随着企业规模的扩大和办公业态多样化发展&#xff0c;会面临着业务流程繁杂、数据利用率低、IT成本高、泄密…

RFID警用装备管理系统-公安警用装备管理可视化系统

一、方案背景 我国警用装备物资种类多、数量大、价值高&#xff0c;还包含枪支、弹药、爆炸物等需要重点监管的物资&#xff0c;在公安机关应对紧急情况、处理突发事件过程中发挥了极为重要的作用。但是&#xff0c;由于缺乏有效的信息化管理手段&#xff0c;还存在管理方式落后…

Tealium 分析

文章目录1.0 调用流程1.1 初始化流程1.2 发送数据流程2.0 Tealium 的设计2.1 总体设计2.1.1 Tealium Core2.1.2 Visitor2.1.3 Crash reporter2.1.4 Ad identifler2.1.5 Lifecycle2.1.6 Location2.1.7 InstallReferrer2.1.8 Hosteddatalayer2.1.8 Dispatcher2.2 网络设计2.3 本地…

黄菊华老师,Java Servlet毕业设计毕设辅导课(4):Servlet 实例

Servlet 实例 Servlet 是服务 HTTP 请求并实现 javax.servlet.Servlet 接口的 Java 类。Web 应用程序开发人员通常编写 Servlet 来扩展 javax.servlet.http.HttpServlet&#xff0c;并实现 Servlet 接口的抽象类专门用来处理 HTTP 请求。 Hello World 示例代码 下面是 Servl…