在 Windows 上编译带 CUDA 的 OpenCV

本文一步一步地介绍如何在 windows 上编译带 CUDA 模块(GPU)支持的 OpenCV,为避免长篇大论,截图过多,尽可能简单地描述

本次安装说明:

本次在 windows10 上、RTX2060S 编译 OpenCV4.5.0,其他相关软件安装情况如下:

  • NVIDIA Diver 461
  • CUDA 11.1
  • CUDNN 8.0.4
  • Cmake 3.19.3
  • Visual studio 2017

第一步:安装前准备

  1. 确认系统显卡牌子为:NVIDIA,并在此查看是否支持 CUDA ,在列表中找到即是支持显卡
  2. 下载并安装显卡驱动
  3. 下载并安装 CUDA,下载 CUDNN,安装过程参考
  4. 下载并安装 CmakeGUI
  5. 下载并安装 VIsual sudio 2017
  6. 下载 OpenCV
  7. 下载 OpenCV contrib,需跟 OpenCV 同版本
  8. 解压 OpenCV 及 OpenCV contrib
  9. 在 OpenCV 解压目录下创建 build

第二步:使用 Cmake-gui 构建 opencv

  1. ** 启动 Cmake:** 为编译 OpenCV 的 Python 接口,需在在终端激活某个 conda 虚拟环境,并运行 cmake-gui 程序,如不需要使用 Python 接口,直接运行 cmake-gui 即可
  2. 配置 Cmake:(1)source code 选择 OpenCV 解压后的源码;(2)build binaries 选择第一步创建的 build 目录;(3)点击 Configure,在弹窗中依次选 VIsual sudio 15 2017x64,点击 Finish
  3. ** 配置 CUDA 模块:**Cmake 完成初始编译编译后,在出现的红色新选项中勾选 WITH_CUDAOPENCV_DNN_CUDAENABLE_FAST_MATH
  4. ** 配置 OpenCV contrib:** 在出现的红色新选项中找到 OPENCV_EXTRA_MODULES_PATH,并将 Value 配置为第一步解压的 OpenCV contrib 目录下的 modules 目录路径
  5. 配置 OpenCV 的 Python 接口:(1)点击 Add Entry 新增 BUILD_opencv_python3 和 BUILD_opencv_python2 两项,其中 BUILD_opencv_python3 设置 value 为 true,另一个设置为 false;(2)搜索并配置 PYTHON3_EXECUTABLEPYTHON3_INCLUDE_DIRPYTHON3_LIBRARYPYTHON3_NUMPY_INCLUDE_DIRSPYTHON3_PACKAGES_PATH,配置结果看下图 [1]
  6. ** 其他配置项:** 搜索并勾选 OPENCV_ENABLE_NONFREEbuild_opencv_world
  7. 再次点击 COnfigure,在新增红色配置项中找到 CUDA_ARCH_BIN,删除小于显卡计算能力的数值,计算能力可以在找到。
  8. 再次点击 COnfigure,确认日志中出现 Configuring done 后,点击 Generate

image-20210306160653041

第三步:使用 Visual studio 编译 opencv

  1. 点击 Open Project 或者使用 Visual studio 打开 OpenCV.sh
  2. 打开后,更改 Debug 模式为 Release 模式
  3. 右键点击 Cmake Targets 下的 ALL_BUILD,并点击 build,此步编译文件需要较长时间
  4. 一旦完成,右键点击 Install,并点击 build

到此,已经成功在 windows10 上编译了带 CUDA 模块的 OpenCV,编译得到的文件位于 build\install

第四步:Python 及 C++ 使用

Python 端使用

  1. 安装 OpenCV 到 Python,
  2. 新建 Python 文件,写入以下内容,并在终端运行,如果无误则运行成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import cv2

#查看opencv信息
print(cv2.getBuildInformation())

#读取图片
frame=cv2.imread('test.jpg')
print(frame.shape)

#上传图片到GPU
gpu_frame=cv2.cuda_GpuMat()
gpu_frame.upload(frame)

#resize
gpu_resframe=cv2.cuda.resize(gpu_frame,(1024,512))
cpu_resfram=gpu_resframe.download()
print(cpu_resfram.shape)

C++ 端使用

  1. 配置系统环境,将编译目录下的 install\x64\vc15\bin 完整路径配置到系统路径下,并重启系统
  2. 打开 visual studio,新建 Visual C++ 空项目,新建文件 main.cpp,写入下面内容
  3. 点击生成->生成解决方案,不出现错误后,运行程序,无错误即可使用 OpenCV 的 cuda 模块
  4. 配置 OpenCV 开发环境,依次点击视图->其他窗口->属性窗口,右键点击 Release | x64,新建项目属性表,新建完成后双击项目该文件,进行以下配置。
  • VC++ 目录 -> 包含目录:E:\opencv-4.5.0\build_test\install\include;E:\opencv-4.5.0\build_test\install\include\opencv2;$(IncludePath)
  • **VC++ 目录 -> 库目录:**E:\opencv-4.5.0\build_test\install\x64\vc15\lib;$(LibraryPath)
  • ** 链接器 -> 输入:**opencv_world450.dll;%(AdditionalDependencies)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <sstream>

#include <opencv2/core.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/dnn/all_layers.hpp>

#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>

int main() {
//读取图片
const std::string image_path = "C:\\Users\\wushaogui\\Desktop\\CCP_REPOS\\SegementModule\\SegementModule\\test.jpg";
cv::Mat rgb_image = cv::imread(image_path, 1);

cv::cuda::GpuMat gpu_frame, gpu_resized;
//上传图片到GPU
gpu_frame.upload(rgb_image);

//Resize
auto input_size = cv::Size(1024,512);
cv::cuda::resize(gpu_frame, resized, input_size, 0, 0, cv::INTER_NEAREST);

//下载并保存图片
cv::Mat cpu_resized;
gpu_resized.download(cpu_resized);
cv::imwrite("resized_test.jpg", cpu_resized);
}

第四步:解决问题及其他需了解信息

资源无法下载 [2]

在此次编译中,无法下载的资源有:ADE、face_landmark_model.dat、ffmpeg、ippicv、nvidia_optical_flow、xfeatures2d

** 解决方法:** 网络下载,这些文件,计算文件 md5 进行文件重命名后,将文件放置在编译目录下的.cache 目录下,此次编译放置情况如下:

image-20210306150042380

参考资料 [3][4]


  1. win10 使用 vs2019 从源码编译 OpenCV4.5+cuda10.2+cudnn8.0 的 C++ 环境和 Python 环境 ↩︎

  2. windows 安装 opencv4.1.1 过程中 ffmpeg、ippicv、face_landmark_model 下载出错解决办法 ↩︎

  3. Build OpenCV 4.4.0 with CUDA (GPU) Support on Windows 10 (Without Tears) | by M. Haroon Shakeel | Medium ↩︎

  4. Win10 下编译同时支持 CUDA 以及 Python3 的 OpenCV 4.2 教程_吃白兔的小青菜的博客 - CSDN 博客 ↩︎