在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博客 ↩︎