OpenCV4.4 CUDA编译与加速全解析
OpenCV4.4 + CUDA概述
OpenCV4.4中关于CUDA加速的内容主要有两个部分,第一部分是之前OpenCV支持的图像处理与对象检测传统算法的CUDA加速;第二部分是OpenCV4.2版本之后开始支持的针对深度学习卷积神经网络模型的CUDA加速。这些内容都在OpenCV的扩展模块中,想要获取这OpenCV CUDA的支持,必须首先编译OpenCV CUDA相关的模块,这里主要是开展模块以CUDA开头的那些。此外编译的电脑或者PC必须有N卡(英伟达GPU卡),并且按照好了正确版本的驱动与cuDNN支持软件。本文分为两个部分来说明如何在OpenCV中实现CUDA加速,第一部分是实现CUDA支持版本OpenCV编译,第二部分是OpenCV CUDA SDK编程代码演示。
01
OpenCV+CUDA编译与配置
首先说一下系统与相关软件版本:
- Window 10 x64
- VS2015专业版
- CMake 3.17.1
- OpenCV4.4.0
- OpenCV_contrib-4.4.0
- CUDA10.0
- cuDNN7.0
OpenCV4.4下载地址
https://github.com/opencv/opencv/releases/download/4.4.0/opencv-4.4.0-vc14_vc15.exe
OpenCV4.4扩展模块下载地址:
https://github.com/opencv/opencv_contrib/archive/4.4.0.zip
下载好OpenCV4.4极其扩展模块之后,我们就开始下面的编译步骤。
第一步:打开CMake,设置好下面的目录路径,注意源代码路径需要指向真实的OpenCV的source目录。图示如下:
第一次运行,记得参数选择x64
如果成功运行了config之后,请继续完成下面的设置。
第二步:设置扩展模块路径,勾选所有CUDA选项再次点击config
点击config运行之后,再点击generate安装,如果一切OK即可完成CMake部分,下面就是到build的目录下:
D:opencv-4.4.0opencvcudabuild
双击打开OpenCV.sln工程文件,切换到release模型下,右键点击ALL_BUILD选择【生成….】运行完成,再次右键选择install,选择【生成…】这两次过程都会比较漫长,编译完成之后,就会得到intall目录,我们需要的就是它,其它都可以删掉了。这样我们就完成了OpenCV CUDA的编译。
注意点:
可能看我编译最多30分钟完成这些操作(等待时间不计在内),但是第一次这么干的新手会遇到各种问题,其中最常见的一个网络问题就是无法下载第三方库,导致CMake编译失败,这里时候需要手动下载一下,然后copy到
D:opencv-4.4.0opencvsources3rdparty
文件下对于目录内即可。
在config的扩展模块的时候,请去掉所有test相关的模块,然后选择不编译opencv_face模块,原因是它会下载一些东西,但是网络无法连接,这样就可以cmake失败。
完成了整个编译过程之后,生成install之后就可以来配置OpenCV CUDA支持啦!跟配置正常OpenCV4版本相似,唯一不同的就是这里没有opencv_world440.lib文件了,而且根据各个模型生成lib,需要把这些lib全部添加到链接器中,然后把库目录与包含目录原来指向目录都改到指向编译以后的install内相关目录路径,把vc14/bin目录添加环境变量中去。重启VS2015,即可完成全部配置过程。
上述步骤的详细操作,B站视频,直接这里观看!
https://www.bilibili.com/video/BV1Rp4y1a7cm/
02
CUDA加速演示
OpenCV支持传统的图像处理的CUDA加速,从OpenCV4.2开始支持深度神经网络的CUDA加速,因此在OpenCV4.4中,CUDA是既可以加速传统的图像处理,特征与对象检测;又可以支持深度神经网络的CUDA加速。下面的代码首先查询相关GPU
cuda::printCudaDeviceInfo(cuda::getDevice());
int count = cuda::getCudaEnabledDeviceCount();
if (count > 0) {
printf("GPU Device Count : %d n", count);
}
设备信息,代码与运行截图如下:
DNN人脸检测加速
CPU上运行OpenCV DNN人脸检测:
GPU上运行OpenCV DNN人脸检测:
视频背景分析
可以看出,无论是对传统图像处理的视频背景分析,还是基于深度学习DNN人脸检测,OpenCV CUDA都可以取得很好的加速效果。
注意:OpenCV4.4的CUDA导入跟之前的方式有所不同,模型头文件更加模块化,需要导入的头文件如下:
#include <opencv2/cudaarithm.hpp>
#include <opencv2/cudaoptflow.hpp>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/cudafeatures2d.hpp>
#include <opencv2/cudaobjdetect.hpp>
#include <opencv2/cudawarping.hpp>
#include <opencv2/cudafilters.hpp>
下载1:OpenCV黑魔法
在「AI算法与图像处理」公众号后台回复:OpenCV黑魔法,即可下载小编精心编写整理的计算机视觉趣味实战教程
下载2 CVPR2020
在「AI算法与图像处理」公众号后台回复:CVPR2020,即可下载1467篇CVPR 2020论文个人微信(如果没有备注不拉群!)请注明:地区+学校/企业+研究方向+昵称
- 推荐|14种模型设计帮你改进你的卷积神经网络(CNN)!
- 【源码】Python的开源人脸识别库:离线识别率高达99.38%
- 如何使用深度学习去除人物图像背景
- 开源|人脸检测的C / C ++源代
- Python高性能计算库——Numba
- 最新|官方发布:TensorFlow 数据集和估算器介绍
- 干货 | PyTorch相比TensorFlow,存在哪些自身优势?
- 用TensorFlow和TensorBoard从零开始构建ConvNet(CNN)
- 从零开始:手把手教你安装深度学习操作系统、驱动和各种python库!
- TensorFlow中的那些高级API
- 特征工程之Scikit-learn
- 浅谈NumPy和Pandas库(一)
- 例解生成对抗网络
- PyTorch和Tensorflow版本更新点
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android studio 下JNI编程实例并生成so库的实现代码
- Android实现简单时钟View的方法
- Android编程之创建自己的内容提供器实现方法
- Android自定义View圆形和拖动圆、跟随手指拖动效果
- Android开发之OkHttpUtils的具体使用方法
- Xshell5连接虚拟机中的Linux的方法以及失败原因解决
- Android 多线程的实现方法总结
- Android编程之SQLite数据库操作方法详解
- 浅谈android组件化之ARouter简单使用
- Android ScrollView实现下拉弹回动画效果
- Android实现用文字生成图片的示例代码
- Android bindservice失败解决方法
- Android 悬浮窗权限各机型各系统适配大全(总结)
- Android中Fragment相互切换间不被回收的实现方法
- Android手机管理工具类详解