1. opencv及opencv_contrib源码的下载
- opencv源码的下载:https://opencv.org/releases/或者https://github.com/opencv/opencv/releases注意:两者区别主要为官网下载的源码里面有build文件夹,里面有经过编译的lib及include等文件,但并不包含contrib里面的所有模块,而且整个文件被编译成opencv_world一个库,打包时不利于减少软件体积,推荐自己编译。
- opencv_contrib源码的下载:https://github.com/opencv/opencv_contrib/releases注意:opencv与opencv_contrib的版本必须一致。
2. CUDA与cuDNN的下载与安装
- CUDA Toolkit下载:https://developer.nvidia.com/cuda-toolkit-archive
注意:如果nvidia显卡驱动版本较低的话无法安装新版的cuda,下载前可以先检查一下自己的显卡驱动版本,可在nvidia控制面板->系统信息中查看。
- cuDNN的下载:https://developer.nvidia.com/cudnn-download-survey注意:下载cuDNN时需要注册账号,注意cuDNN的版本要和CUDA对应
- CUDA的安装
运行下载后的exe文件,推荐按照默认设置安装,安装完成打开cmd输入
cuda -V
如出现如下类似信息,表明安装成功。
也可以通过运行cuda自带的例子来验证安装是否成功,推荐CUDA Samples中1_Utilities下的deviceQuery程序,安装成功的话运行会得到GPU算力、显存大小等相关信息。
- cuDNN的安装
注意:将三个文件夹中的文件复制到cuda相对应的目录下(默认安装的话路径应为C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\),注意是将最里层的文件并非这三个文件夹。
3. cmake的下载与安装:
- 按照安装引导安装即可。
4. 利用cmake与vs2017编译,遇到任何报错警告可以先看文章第5部分。
- 在opencv文件中建立一个文件夹用来存放编译后的文件。
- 点击左下角Configure键,然后选择自己电脑上安装的vs对应的版本(后面的数字2017是版本,不是15),平台推荐选择x64。
- 可能得一会时间,因为要下载一些文件,而这些文件大概率会下载失败,解决方法见第5章,进度条完成后,修改一些编译的参数,可通过Search栏快速查找需要修改的参数。
(1)打开CUDA模块,看网上好多人不建议打开BUILD_CUDA_STUBS,具体原因并没有深究,另外两个模块需勾选。
(2)添加拓展包的路径,添加的为opencv_contrib文件夹中的module文件夹。
(3)如果不需要一些python,java相关的接口以及一些测试案例,可以搜索关闭这些,加快编译速度。
(4)BUILD_opencv_world参数为是否将所有的库打包成一个整体,这个看自己需要,勾选的话在vs配置环境会比较方便,只需要添加一个lib文件,但是软件发行打包体积会比较大。
- 再次点击Configure按钮,构建完毕后可以将CUDA_ARCH_BIN参数修改为自己显卡所对应的算力,可大幅度加快后续编译速度。显卡对应算力见https://developer.nvidia.com/zh-cn/cuda-gpus#compute,也可以通过前面提到Samples中的deviceQuery得到。
- 最好等到输出信息中没有警告与报错,CUDA与cuDNN都被检测到而输出信息最后出现Configure done时再点击Generate按钮。
- 生成完成后,可通过Open Project直接在vs中打开项目。
- 点击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有关的两个组件。
- 文件下载失败,类似这样的报错,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中对应的空文件中。
(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中添加类似的路径。
(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)
注意:要想知道自己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/