windows编译opencv,支持cuda加速

原文链接

https://xugaoxiang.com/2019/12/26/build-opencv-with-cuda-for-windows/

软硬件环境

  • windows 10 64bit
  • nvidia gtx 1070Ti
  • opencv 4.2.0-dev
  • cuda 10.2
  • cudnn 7.6.5.32
  • visual studio 2019

前言

本文的目标是在window10的系统上编译opencv的最新源码版本(4.2.0),使能cudacudnn加速。关于cudacudnnwindows10上的安装,请参考之前的文章 https://xugaoxiang.com/2019/12/18/windows-10-cuda-cudnn/

超级详细的图文教程

第一步去下载opencvopencv_contrib的源代码,我们放在一个统一的目录进行管理,比如我这里的C:\xugaoxiang\opencv_cuda,另外再创建一个vs文件夹,用来存放编译生成的文件,此时的目录结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-egiUd7H7-1577687025574)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_00.png)]

接下来去下载源码

git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git

由于opencv是基于cmake进行编译的,为了方便进行cmake编译参数的设定,我们去下载cmake并使用cmake-gui进行配置,下载地址是 https://cmake.org/download/

下载安装完毕后,我们打开cmake-gui

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AnkuTvMA-1577687102559)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_01.png)]

指定好Where is the source codeWhere to build the binaries的路径,然后点击下方的Configure按钮

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-64vwciCx-1577687025576)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_02.png)]

出现了python2相关的错误,直接忽略,因为根本就没有装,而且版本也快被废弃了。我的python环境是anaconda,别忘了设定系统环境变量

扫描二维码关注公众号,回复: 11073366 查看本文章

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YxvpVQkK-1577687025577)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_03.png)]

接下来由于网络的原因,出现了两个下载的错误,我们放在一起来讲,先看错误提示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zGgkJ5l0-1577687025577)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_04.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4ALgh8af-1577687025578)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_05.png)]

一个是ippicv,另一个是ffmpeg,我尝试过几次反复下载,都没有成功。所以只能另想办法,根据错误提示,打开文件opencv\3rdparty\ippicv\ippicv.cmake,找到下载地址

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uKM0dMYR-1577687025578)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_06.png)]

注意到这个链接并不是最终的下载地址,它需要进行拼接,首先找到${IPPICV_COMMIT}对应的值,然后找到软件压缩包的名称,这两个值都可以在当前的ippicv.cmake文件中找到

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gKvNGWfY-1577687025579)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_07.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8zV5eged-1577687025580)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_08.png)]

拼接好的最终的文件包下载路径如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2jD5kIBe-1577687025581)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_10.png)]

然后将链接的文件下载下来,用浏览器就可以

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zd1bbrGH-1577687256026)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_09.png)]

下载下来的zip包,还需要做最后一项工作,还是在ippicv.cmake文件中,找到OPENCV_ICV_HASH对应的值,然后将下载的zip包的文件进行重命名,得到1d222685246896fe089f88b8858e4b2f-ippicv_2019_win_intel64_20180723_general.zip,将此文件拷贝到opencv\.cache\ippicv

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8dCYfEiQ-1577687025582)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_11.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iGE1rg6y-1577687025583)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_12.png)]

同样的步骤,我们把ffmpeg缺失的文件也下载下来,放到相应的目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JAhHxaRD-1577687025583)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_13.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zhw8C061-1577687025583)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_14.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1vPMRw3p-1577687352404)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_15.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YXiBMWNp-1577687025584)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_16.png)]

继续Configure,又有文件下载不了,face_landmark_module.dat,这是个跟人脸识别相关的文件,我们也按照之前的方法手动去下载,然后存放到相应的目录里去

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZTb22JDl-1577687404634)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_28.png)]

继续进行Configure,又有错误出现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tZKJ0o81-1577687025585)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_17.png)]

看提示,是opencv_contrib的路径没有指定,点击cmake-gui上的Add Entry,添加OPENCV_EXTRA_MODULES_PATH,指向下载好的opencv_contrib下的modules文件夹,特别注意,这里的目录分隔符一定要用/,即使是在windows上面,如下图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dAnvLsYA-1577687025587)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_18.png)]

由于cuda安装版本的关系,我们用了最新的10.2,会出现cuda某些版本不支持的错误

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aI3qUXRK-1577687025588)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_19.png)]

通过grep工具,我们找到变量CUDA_ARCH_BIN是在vs/CMakeCache.txt中定义,我们直接修改这个文件中的值,去掉小的版本号

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-crseKHnn-1577687025597)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_20.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H80mw5It-1577687025601)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_21.png)]

由于cmake-gui缓存的原因,我们还需要在cmake-gui中修改CUDA_ARCH_BIN的值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z68PWBuQ-1577687492775)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_22.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1zs2Xhlz-1577687025606)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_23.png)]

后面就比较顺利了,直至Configure成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dHvnkJE0-1577687025606)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_24.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tI29ATDw-1577687025607)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_25.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1QA2Z5o7-1577687025608)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_26.png)]

到这里,就可以去生成visual studio的工程了,点击cmake-gui上的Generate

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GuwAVcXz-1577687025609)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_27.png)]

接着,来到vs文件夹,用visual studio 2019打开文件OpenCV.sln,在右侧解决方案里的CMakeTargets下的INSTALL,右键选择生成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CQVA6Agf-1577687025610)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_31.png)]

正式开始编译安装,等待一段时间,这里我跑了接近2个小时,取决于你的电脑性能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QHo3umTY-1577687025611)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_32.png)]

最后来到opencv安装路径查看

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WBW9iXUz-1577687025612)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_33.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tavFbLfC-1577687630978)(https://code.xugaoxiang.com/xugaoxiang/blog/raw/master/images/ai/opencv/vs_opencv_34.png)]

可以看到生成了跟cuda相关的dll!

小结

在整个编译安装的过程中,出现了多次的软件包下载不成功的问题,这个网络环境造成的,只能另想办法。要想成功,必须足够耐心。编译好的opencv库文件到底怎么用?我们后面继续。

公众号

在这里插入图片描述

参考资料

发布了74 篇原创文章 · 获赞 58 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/djstavaV/article/details/103765836