1. opencv及opencv_contrib源码的下载

2. CUDA与cuDNN的下载与安装

OpenCV的dnn_superres模块可能不支持GPU加速 opencv dnn cuda_Visual

注意:如果nvidia显卡驱动版本较低的话无法安装新版的cuda,下载前可以先检查一下自己的显卡驱动版本,可在nvidia控制面板->系统信息中查看。

OpenCV的dnn_superres模块可能不支持GPU加速 opencv dnn cuda_CUDA_02

OpenCV的dnn_superres模块可能不支持GPU加速 opencv dnn cuda_CUDA_03

  • cuDNN的下载:https://developer.nvidia.com/cudnn-download-survey注意:下载cuDNN时需要注册账号,注意cuDNN的版本要和CUDA对应
  • CUDA的安装
    运行下载后的exe文件,推荐按照默认设置安装,安装完成打开cmd输入
cuda -V

如出现如下类似信息,表明安装成功。

OpenCV的dnn_superres模块可能不支持GPU加速 opencv dnn cuda_Visual_04

也可以通过运行cuda自带的例子来验证安装是否成功,推荐CUDA Samples中1_Utilities下的deviceQuery程序,安装成功的话运行会得到GPU算力、显存大小等相关信息。

  • cuDNN的安装

注意:将三个文件夹中的文件复制到cuda相对应的目录下(默认安装的话路径应为C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\),注意是将最里层的文件并非这三个文件夹。

3. cmake的下载与安装:

OpenCV的dnn_superres模块可能不支持GPU加速 opencv dnn cuda_Visual_05

  • 按照安装引导安装即可。

4. 利用cmake与vs2017编译,遇到任何报错警告可以先看文章第5部分。

  • 在opencv文件中建立一个文件夹用来存放编译后的文件。

OpenCV的dnn_superres模块可能不支持GPU加速 opencv dnn cuda_CUDA_06

  • 点击左下角Configure键,然后选择自己电脑上安装的vs对应的版本(后面的数字2017是版本,不是15),平台推荐选择x64。

OpenCV的dnn_superres模块可能不支持GPU加速 opencv dnn cuda_Visual_07

  • 可能得一会时间,因为要下载一些文件,而这些文件大概率会下载失败,解决方法见第5章,进度条完成后,修改一些编译的参数,可通过Search栏快速查找需要修改的参数。
    (1)打开CUDA模块,看网上好多人不建议打开BUILD_CUDA_STUBS,具体原因并没有深究,另外两个模块需勾选。

(2)添加拓展包的路径,添加的为opencv_contrib文件夹中的module文件夹。

OpenCV的dnn_superres模块可能不支持GPU加速 opencv dnn cuda_opencv_08

(3)如果不需要一些python,java相关的接口以及一些测试案例,可以搜索关闭这些,加快编译速度。

(4)BUILD_opencv_world参数为是否将所有的库打包成一个整体,这个看自己需要,勾选的话在vs配置环境会比较方便,只需要添加一个lib文件,但是软件发行打包体积会比较大。

OpenCV的dnn_superres模块可能不支持GPU加速 opencv dnn cuda_cuda_09

  • 再次点击Configure按钮,构建完毕后可以将CUDA_ARCH_BIN参数修改为自己显卡所对应的算力,可大幅度加快后续编译速度。显卡对应算力见https://developer.nvidia.com/zh-cn/cuda-gpus#compute,也可以通过前面提到Samples中的deviceQuery得到。
  • 最好等到输出信息中没有警告与报错,CUDA与cuDNN都被检测到而输出信息最后出现Configure done时再点击Generate按钮。

OpenCV的dnn_superres模块可能不支持GPU加速 opencv dnn cuda_opencv_10

  • 生成完成后,可通过Open Project直接在vs中打开项目。

OpenCV的dnn_superres模块可能不支持GPU加速 opencv dnn cuda_opencv_11

  • 点击vs中的生成->批生成,选择其中的ALL_BUILD与INSTALL,共四项,然后点击生成。
  • 经过漫长时间的等待,编译完毕后,会在自己建立的文件夹中生成install文件夹,里面的东西就是我们需要的。

5. 遇到的问题及解决方案



Error in configuration process, project files may be invalid
CMake Error at CMakeLists.txt:99 (enable_language):
  Generator

    Visual Studio 17 2022

  could not find any instance of Visual Studio.

解决:

(1)找不到vs,首先检查是不是自己选错了VS的版本,后面的2022这样的数字才是版本(删除掉编译文件夹中的文件可重新选择)。

(2)添加VS的环境变量。

(3)通过Visual Studio installer安装必要组件。选择工作负荷中的Visual Studio拓展开发,单个组件中的与cmake有关的两个组件。

OpenCV的dnn_superres模块可能不支持GPU加速 opencv dnn cuda_opencv_12

  • 文件下载失败,类似这样的报错,sources/.cache中文件大小为0kb。
IPPICV: Download: ippicv_2019_win_intel64_20180723_general.zip
Try 1 failed
=======================================================================
  Couldn't download files from the Internet.
  Please check the Internet access on this host.
=======================================================================
CMake Warning at cmake/OpenCVDownload.cmake:202 (message):
  IPPICV: Download failed: 6;"Couldn't resolve host name"
  For details please refer to the download log file:
  E:/buildCUDA_world/CMakeDownloadLog.txt

解决:

(1)查看CMakeDownloLog.txt文件,可以通过将里面的网站复制粘贴到浏览器可直接下载到对应的文件,下载失败的文件都可以通过此方法自行下载得到,代码的话可以复制粘贴到.cache中对应的空文件中。

OpenCV的dnn_superres模块可能不支持GPU加速 opencv dnn cuda_CMake_13

(2)将下载好的文件放到.cache文件夹中对应的位置来替换掉空白文件,注意要将新下载的文件重命名为与空白文件同名的文件,包括前面的一串字母数字,然后删除掉空白文件,再次Configure时就不会下载这些文件了。



CMake Warning at cmake/OpenCVGenSetupVars.cmake:54 (message):
  CONFIGURATION IS NOT SUPPORTED: validate setupvars script in install
  directory
Call Stack (most recent call first):
  CMakeLists.txt:947 (include)

解决:取消勾选OPENCV_GENERATE_SETUPVARS选项

  • 找不到cuDNN
Could NOT find CUDNN (missing: CUDNN_LIBRARY CUDNN_INCLUDE_DIR) (Required is at least version "7.5")

解决:

(1)确定自己是否安装cuDNN。

(2)在环境变量中添加CUDNN_LIBRARY与CUDNN_INCLUDE_DIR,分别为cuda安装目录下lib与include文件夹,也可以继续在path中添加类似的路径。

OpenCV的dnn_superres模块可能不支持GPU加速 opencv dnn cuda_cuda_14

(3)如果仍然找不到cuDNN,但报错信息变为下面这样,貌似找到了cudnn,但是版本为空,这个主要原因为我使用的这个版本的cuDNN(其他版本没有尝试)将版本信息从cudnn.h转移到了cudnn_version.h,而findCUDANN.cmake仍然从cuda.h中寻找文件,这就造成了找到了cuDNN但是无法获取版本号,这时需要将sources/cmake/findCUDANN.cmake文件中寻找version信息的cuda.h替换为cudnn_version.h。

Could NOT find CUDNN: Found unsuitable version "..", but required is at least "7.5" (found C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.1/lib/x64/cudnn.lib)

OpenCV的dnn_superres模块可能不支持GPU加速 opencv dnn cuda_Visual_15


注意:要想知道自己cuDNN的版本是否将版本信息放在了cudnn_version.h中,可以在自己下载的cuDNN源码include文件夹中查看。

CMake Error at modules/dnn/CMakeLists.txt:99 (message):
  CUDA backend for DNN module requires CC 5.3 or higher.  Please remove
  unsupported architectures from CUDA_ARCH_BIN option.

解决:CUDA_ARCH_BIN选项中小于5.3的数字删除掉,前面提到过为加快编译速度,也可以只选择与自己显卡对应的算力值。

6. 参考文章

https://github.com/opencv/opencv/issues/16380

https://stackoverflow.com/questions/61533880/how-to-find-cudnn-with-cmake

https://www.reddit.com/r/opencv/comments/gokhck/bug_cant_compile_opencv_with_cudnn/