无障碍 关怀版

OpenCV4 | 如何让传统图像处理实现三十倍加速的顶级技能

原标题:OpenCV4 | 如何让传统图像处理实现三十倍加速的顶级技能

OpenCV4 + CUDA 从配置到代码.....

OpenCV4 + CUDA 从配置到代码.....

引子

一直有人在研习社问我,怎么去做OpenCV + CUDA的加速支持。其实网上用搜索引擎就可以找到一堆文章,但是其实你会发现,按照他们的做法基本都不会成功,原因是因为文章中使用的OpenCV版本太老旧、英伟达GPU的CUDA库也太久远。其实这个都不是主要原因,真实原因是OpenCV4跟之前的版本,编译CUDA的方法不一样了。所以感觉有必要自己写一遍,作为全网第一个OpenCV4 + CUDA + GPU编译与代码测试的教程给大家。希望大家都可以获得此技能,整个教程分为如下几个部分:

1. CUDA软件安装与配置

2. OpenCV+cmake编译CUDA模块支持

3. 代码实现与测试

4. 模块支持与应用场景

在开始教程之前,先说一下相关软件与版本信息

Windows 10 64bit

英伟达CUDA 10.0

OpenCV 4.1.0

OpenCV扩展模块4.1.0

GTX 1050 TI

VS2015 专业版

CMake 3.13.4

CUDA软件安装与配置

01

首先确保你有英伟达的独立显卡(GPU),然后请到英伟达官方网站,在线检查与下载最新的显卡驱动版本。地址如下:

安装/更新好驱动之后,就可以下载对应版本的CUDA工具包,下载地址如下:

下载好之后,就可以开始进行安装,只要默认安装即可。关于CUDA的安装与配置,更加详细的内容可以参考这里:

升级到tensorflow2.0,我整个人都不好了

上面的文章中已经详细交代了。安装好之后我们就完成了第一步操作。

OpenCV+CMake编译

02

首先安装好CMake,下载地址如下:

其次需要下载OpenCV与OpenCV扩展模块的源代码,地址如下:

下载好之后解压缩到D盘指定目录即可。

打开CMake,设置好源码路径与编译输出路径之后,显示如下:

点击【configure】目标,弹出对话框选择如下:

然后点击【Finish】完成config之后,再点击【generate】按钮。

编译CUDA与扩展模块

完成上述操作之后,然后找到OPENCV_EXTRA_MODULE_PATH设置扩展模块的源代码路径。设置以后,在搜索框中输入CUDA,

上述两个选项打勾之后,再次点击【configure】按钮,完成之后,显示如下:

CUDA_FAST_MATH选项打勾,然后执行【Generate】按钮。最终CMake的结果如下:

这个时候去cudabuild这里目录下,双击打开OpenCV.sln(VS2015工程文件),选择CMake_Targets -> ALL_BUILD,然后右键->生成,完成之后,再选择INSTALL右键生成。这个过程时间会比较久一点,估计会有一个小时到两个小时左右,跟电脑性能有关系。完成之后,你就会看到再cudabuild目录下多出一个install目录,这个就是我们编译得到支持CUDA版本的OpenCV。打开检查一下:

我的是今天早晨刚刚完成编译的。然后按照正常的OpenCV配置,配置好VS2015+OpenCV开发环境。如果还不知道怎么配置,看这里:

这里需要特别注意一点,我这里没有勾选生成opencv_world,主要是怕编译过程中有模块出错,会导致生产失败,所以就每个模块生成一个lib/dll的库。配置的lib链接器的时候,需要把下面的库文件全部加入:

opencv_aruco410d.lib

opencv_bgsegm410d.lib

opencv_bioinspired410d.lib

opencv_calib3d410d.lib

opencv_ccalib410d.lib

opencv_core410d.lib

opencv_cudaarithm410d.lib

opencv_cudabgsegm410d.lib

opencv_cudacodec410d.lib

opencv_cudafeatures2d410d.lib

opencv_cudafilters410d.lib

opencv_cudaimgproc410d.lib

opencv_cudalegacy410d.lib

opencv_cudaobjdetect410d.lib

opencv_cudaoptflow410d.lib

opencv_cudastereo410d.lib

opencv_cudawarping410d.lib

opencv_cudev410d.lib

opencv_datasets410d.lib

opencv_dnn410d.lib

opencv_dnn_objdetect410d.lib

opencv_dpm410d.lib

opencv_face410d.lib

opencv_features2d410d.lib

opencv_flann410d.lib

opencv_fuzzy410d.lib

opencv_gapi410d.lib

opencv_hfs410d.lib

opencv_highgui410d.lib

opencv_imgcodecs410d.lib

opencv_imgproc410d.lib

opencv_img_hash410d.lib

opencv_line_deor410d.lib

opencv_ml410d.lib

opencv_objdetect410d.lib

opencv_optflow410d.lib

opencv_phase_unwrapping410d.lib

opencv_photo410d.lib

opencv_plot410d.lib

opencv_quality410d.lib

opencv_reg410d.lib

opencv_rgbd410d.lib

opencv_saliency410d.lib

opencv_shape410d.lib

opencv_stereo410d.lib

opencv_stitching410d.lib

opencv_structured_light410d.lib

opencv_superres410d.lib

opencv_surface_matching410d.lib

opencv_text410d.lib

opencv_tracking410d.lib

opencv_video410d.lib

opencv_videoio410d.lib

opencv_videostab410d.lib

opencv_xfeatures2d410d.lib

opencv_ximgproc410d.lib

opencv_xobjdetect410d.lib

opencv_xphoto410d.lib

特别提醒,千万不要copy我的,因为也许你的版本不是OpenCV4.1.0,或者你的编译生成有模块失败,没有我这么多lib文件。这样我们就完成了CUDA编译支持。这里需要特别注意的,在VS2015编译阶段,必须先选择ALL_BUILD,切记

OpenCV代码测试与运行

03

OpenCV4支持CUDA运行的模块,主要包括 图像处理、视频读写、视频分析、传统的对象检测包括HOG、级联检测器、特征提取部分、卷积滤波与图像二值分析、图像分割模块。这里我在OpenCV提供的示例代码基础上稍加改动,实现了一个基于背景分割的视频分析程序:

#include<iostream>

#include<string>

#include"opencv2/core.hpp"

#include"opencv2/core/utility.hpp"

#include"opencv2/cudabgsegm.hpp"

#include"opencv2/video.hpp"

#include"opencv2/highgui.hpp"

usingnamespacestd;

usingnamespacecv;

usingnamespacecv::cuda;

enumMethod

{

MOG,

MOG2,

};

intmain(intargc, constchar** argv)

{

Method m = MOG;

intcount = cuda::getCudaEnabledDeviceCount;

printf( "GPU Device Count : %d n", count);

VideoCapture cap;

cap.open( "D:/images/video/example_dsh.mp4");

Mat frame;

cap >> frame;

GpuMat d_frame(frame);

Ptr<BackgroundSubtractor> mog = cuda::createBackgroundSubtractorMOG;

Ptr<BackgroundSubtractor> mog2 = cuda::createBackgroundSubtractorMOG2;

GpuMat d_fgmask;

GpuMat d_fgimg;

GpuMat d_bgimg;

Mat fgmask;

Mat fgimg;

Mat bgimg;

switch(m)

{

caseMOG:

mog->apply(d_frame, d_fgmask, 0.01);

break;

caseMOG2:

mog2->apply(d_frame, d_fgmask);

break;

}

namedWindow( "image", WINDOW_AUTOSIZE);

namedWindow( "foreground mask", WINDOW_AUTOSIZE);

namedWindow( "foreground image", WINDOW_AUTOSIZE);

namedWindow( "mean background image", WINDOW_AUTOSIZE);

for(;;)

{

cap >> frame;

if(frame.empty)

break;

int64 start = cv::getTickCount;

d_frame.upload(frame);

//update the model

switch(m)

{

caseMOG:

mog->apply(d_frame, d_fgmask, 0.01);

mog->getBackgroundImage(d_bgimg);

break;

caseMOG2:

mog2->apply(d_frame, d_fgmask);

mog2->getBackgroundImage(d_bgimg);

break;

}

d_fgimg.create(d_frame.size, d_frame.type);

d_fgimg.setTo(Scalar::all( 0));

d_frame.copyTo(d_fgimg, d_fgmask);

d_fgmask.download(fgmask);

d_fgimg.download(fgimg);

if(!d_bgimg.empty)

d_bgimg.download(bgimg);

imshow( "foreground mask", fgmask);

imshow( "foreground image", fgimg);

if(!bgimg.empty)

imshow( "mean background image", bgimg);

doublefps = cv::getTickFrequency / (cv::getTickCount - start);

// std::cout << "FPS : " << fps << std::endl;

putText(frame, format( "FPS : %.2f", fps), Point( 50, 50), FONT_HERSHEY_SIMPLEX, 1.0, Scalar( 0, 0, 255), 2, 8);

imshow( "image", frame);

charkey = ( char)waitKey( 1);

if(key == 27)

break;

}

return0;

}

在我的电脑上 基于1080P的视频文件

  • CPU版本的运行是大概在2FPS
  • GPU版本CUDA加速运行大概在 80 FPS
  • CPU版本的运行是大概在2FPS
  • GPU版本CUDA加速运行大概在 80 FPS

怎么说,完全是碾压式的速度优势。看来以后视频处理必须CUDA版本才过瘾。来自官方的更多加速比较图示如下:

测试1920x1080大小的视频文件,处理帧率如下:

可以说完全实时无压力!

模块支持与应用场景

04

既然CUDA加速这么厉害,为什么OpenCV在正式的release中却没有包含呢?本人觉得OpenCV正式的官方Release版本主要是考虑普适性的问题。另外OpenCV在3.x到4.x升级的时候把CUDA支持从release移到扩展模块中去了,官方也没有解释为什么,我个人感觉更多的是出于商业考虑。

此外OpenCV中DNN模块已经支持OpenVINO加速执行与NCS2加速、所以OpenCV DNN模块不支持英伟达显卡加速支持,支持的模块大部分是以前的传统图像处理、对象检测、特征匹配、双目、图像拼接部分,其实这些对我们已经十分有用,大大扩展了OpenCV的应用场景、另外千万不要随便使用CUDA加速,有些简单的算法,OpenCV已经做的很好了,加速的效果并不明显,不信可以看下面的这个例子:

有点是车祸现场,原因很好解释。这个是因为OpenCV中使用CUDA需要把Mat对象数据上传到CUDA支持单元,完成处理以后再下载到Mat对象上,对一些简单的图像处理,这个操作很容易成为性能瓶颈,从而降低了加速效应。

欢迎扫码加入【OpenCV研习社】 返回搜狐,查看更多

责任编辑:

平台声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
阅读 ()
推荐阅读

代做工资流水公司北京签证银行流水 样本沈阳房贷银行流水 报价常州流水账单打印新乡银行流水账鞍山企业流水打印样本成都贷款银行流水报价宜昌企业银行流水价格宜昌工资证明办理孝感办流水泰安薪资流水单制作威海做流水单济宁公司银行流水制作泰州制作背调流水漳州流水代做镇江代开房贷工资流水开封代做自存流水沧州工资流水价格贵阳车贷银行流水 模板厦门贷款流水公司德阳打印自存流水宜昌车贷工资流水 公司烟台背调流水开具荆州制作公司银行流水商丘对公流水样本襄阳做工资银行流水台州房贷银行流水 公司岳阳制作工作收入证明曲靖开入职流水廊坊做对公账户流水厦门日常消费流水多少钱香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

代做工资流水公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化