Windows10下利用cmake与vs2017编译opencv4.2.0的CUDA模块

1. opencv及opencv_contrib源码的下载

2. CUDA与cuDNN的下载与安装

在这里插入图片描述

注意:如果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://blog.csdn.net/jgj123321/article/details/106349768/

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/

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要让CMake编译OpenCV包含CUDA模块,需要在CMakeLists.txt文件中添加一些设置。具体步骤如下: 1. 确保你已经安装了CUDAOpenCV,并且CUDAOpenCV的环境变量已经设置好。 2. 打开你的CMakeLists.txt文件,在其中添加以下代码: ``` find_package(CUDA REQUIRED) find_package(OpenCV REQUIRED) # 添加CUDA模块 if(CUDA_FOUND) set(CUDA_NVCC_FLAGS "-arch=sm_30" CACHE STRING "nvcc flags" FORCE) set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -O3" CACHE STRING "nvcc flags" FORCE) set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -std=c++11" CACHE STRING "nvcc flags" FORCE) file(GLOB CUDA_SOURCES ${PROJECT_SOURCE_DIR}/src/*.cu) cuda_add_library(my_lib ${CUDA_SOURCES}) target_link_libraries(my_lib ${CUDA_LIBRARIES}) endif() # 添加OpenCV模块 if(OpenCV_FOUND) include_directories(${OpenCV_INCLUDE_DIRS}) add_executable(my_executable ${PROJECT_SOURCE_DIR}/src/main.cpp) target_link_libraries(my_executable ${OpenCV_LIBS}) endif() ``` 上述代码会使用`find_package`命令查CUDAOpenCV。如果到了它们,我们就可以添加CUDA模块OpenCV模块了。 3. 在添加CUDA模块时,我们使用了`cuda_add_library`命令将所有CUDA源文件编译成一个动态链接库。这个库可以被其他代码使用,并且我们使用了`target_link_libraries`命令将CUDA库链接到我们的可执行文件中。 4. 在添加OpenCV模块时,我们使用了`include_directories`命令将OpenCV的头文件路径添加到我们的项目中,并使用了`target_link_libraries`命令将OpenCV库链接到我们的可执行文件中。 5. 最后,你可以使用`cmake`命令生成你的项目文件并进行编译。如果一切顺利,你的项目将包含CUDAOpenCV模块。 注意:在编译CUDA代码时,需要指定你的GPU架构。上述代码中使用的是`-arch=sm_30`,你需要根据你的GPU架构进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值