windows11编译OpenCV4.5.0 with CUDA(附注意事项)

2023-05-16

windows11编译OpenCV4.5.0 with CUDA

在这里插入图片描述

从OpenCV4.2.0 版本开始允许使用 Nvidia GPU 来加速推理。本文介绍最近使用windows11系统编译带CUDA的OpenCV4.5.0的过程。

  • 文中使用【特别注意:…】为大家标识出容易出错的地方。
  • 安装成功后,使用CPU与GPU调用yolov4模型进行推理的耗时测试结果:
GPUCPU
4ms311ms
  • 从差距上看,还是值得花时间编译一下的:)
  • 耗时测试环境:
    • 调用笔记本自带摄像头获取视频
    • Notebook GTX3080显卡

1.准备环境

1.1 下载OpenCV4.5.0

  • 编译需要OpenCV4.5.0的源码
  • 下载地址(3项可选):

    https://opencv.org/releases/
    https://github.com/opencv/opencv/releases/tag/4.5.0
    https://sourceforge.net/projects/opencvlibrary/files/4.5.0/opencv-4.5.0-vc14_vc15.exe/download

  • 下载完成后是一个exe程序,双击即可解压,解压后:
    • source文件夹就是源码
    • build文件夹是编译好的不带CUDA加速的OpenCV4.5.0(本文不使用)

1.2 下载OpenCV4.5.0 contrib

  • Contrib Modules是OpenCV的扩展模块,包含了很多用于实现特定算法
  • 编译OpenCV需要用到contirb模块
  • 特别注意:务必下载与源码对应版本的contrib模块
  • 下载地址(第1个为官方下载地址,第2个为国内某同学搭建的下载库,速度较快):

    https://github.com/opencv/opencv_contrib/tags
    https://www.raoyunsoft.com/opencv/opencv_contrib/opencv_contrib-4.5.0.zip

1.3 准备.cache文件

  • 编译过程中需要联网下载一些依赖库,并存放于sourc.cache文件夹中
  • 特别注意:因要连到外网,因此速度比较慢,有时断网造成编译失败,所以可以提前准备好这些文件
  • OpenCV4.5.0的.cache文件下载地址:

    https://download.csdn.net/download/iracer/85695997

  • 使用方法:
    • 将.cache文件夹拷贝到source文件夹下,与原.cache文件夹合并

1.4 安装Visual Studio 2019

  • 安装CUDA需要vs,这里选择vs2019
  • 安装步提要:
  • Download Visual Studio 2019 Community Edition
  • Select Desktop Development with C++ option and click on install

1.5 安装CUDA和cuDNN

  • NVIDIA官方指南:

    https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#install-windows

  • 本次在windows11上安装的CUDA和cuDNN版本为:
  • CUDA 11.3:cuda_11.3.1_465.89_win10.exe
  • duDNN 8.4:cudnn-windows-x86_64-8.4.0.27_cuda11.6-archive.zip
  • 特别注意:zlib库需要下载并添加到系统环境变量path中,因为cdDNN需要调用该库。
  • zlib库下载地址:

    www.winimage.com/zLibDll/zlib123dllx64.zip
    下载完成后解压zip文件,并将zlibwapi.dll所在目录添加到系统环境变量path

  • 查看CUDA安装结果:
C:\Users\irace>nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Mon_May__3_19:41:42_Pacific_Daylight_Time_2021
Cuda compilation tools, release 11.3, V11.3.109
Build cuda_11.3.r11.3/compiler.29920130_0

1.6 安装CMake

  • 本次是用的是3.22版本,3.19以上版本应该都可以(未逐一测试)
  • 下载地址:

    https://github.com/Kitware/CMake/releases/download/v3.22.5/cmake-3.22.5-windows-x86_64.msi

2. 编译

2.1 CMake生成解决方案

  • 双击解压OpenCV4.5.0.exe,解压后的source目录即OpenCV4.5.0的源码

  • 解压opencv_contrib-4.5.0

  • 新建一个编译目录

    D:\opencv\oepncv4.5.0cuda\build

  • 打开CMake

  • 配置source code:

    D:/opencv/opencv4.5.0/sources

  • 配置目标目录:

    D:\opencv\oepncv4.5.0cuda\build

  • 第1次点击[Configure]

  • 弹出窗口选择vs2019作为编译器:

    Visual Studio 16 2019

  • generate平台选择x64

  • 第2次点击[Configure]后,搜cuda带cuda的都勾选,

    • BUILD_CUDA_STUBS
    • BUILD_opencv_cudaarithm
    • BUILD_opencv_cudabgsegm
    • BUILD_opencv_cudacodec
    • BUILD_opencv_cudafeatures2d
    • BUILD_opencv_cudafilters
    • BUILD_opencv_cudaimgproc
    • BUILD_opencv_cudalegacy
    • BUILD_opencv_cudaobjdetect
    • BUILD_opencv_cudaoptflow
    • BUILD_opencv_cudastereo
    • BUILD_opencv_cudawarping
    • 除此之外此外以下两项数学加速选项也勾选:
    • CUDA_FAST_MATH
    • ENABLE_FAST_MATH勾选好后
    • CMake界面上Search栏搜modules,设置contrib模块路径

    D:\opencv\oepncv4.5.0cuda\opencv_contrib-4.5.0\modules

  • 第3次点击[Configure],完成后,再次搜索cuda,配置CUDA_ARCH_BIN中将显卡的算力内容改成自己显卡的算力,t如下网址查询自己显卡的算力,我保留了7.5;8.0;8.6

    • 查询显卡算力链接

    GeForce 笔记本

    GPUCompute Capability
    GeForce RTX 30808.6
    GeForce RTX 30708.6
    GeForce RTX 30608.6
    GeForce RTX 3050 Ti8.6
    GeForce RTX 30508.6
    Geforce RTX 20807.5
    Geforce RTX 20707.5
    Geforce RTX 20607.5
    GeForce GTX 10806.1
    GeForce GTX 10706.1
    GeForce GTX 10606.1

    GeForce and TITAN 台式机

    GPUCompute Capability
    Geforce RTX 3060 Ti8.6
    Geforce RTX 30608.6
    GeForce RTX 30908.6
    GeForce RTX 30808.6
    GeForce RTX 30708.6
    GeForce GTX 1650 Ti7.5
    NVIDIA TITAN RTX7.5
    Geforce RTX 2080 Ti7.5
    Geforce RTX 20807.5
    Geforce RTX 20707.5
    Geforce RTX 20607.5
    NVIDIA TITAN V7.0
  • 搜索并勾选

    BUILD_opencv_world,可生成一个整的dll方便使用

    OPENCV_ENABLE_NONFREF

  • 解压.cache.rar,将.cache目录拷贝到source目录:

    D:\opencv\oepncv4.5.0\source\.cache >![将下载的.cache目录与source中的.cache目录合并](https://img-blog.csdnimg.cn/

  • 第4次点击[Configure]

  • 完成后,点击[Generate],完美生成:

    配置完成
    配置完成后CMake log中显示找到了CUDA和cuDNN:

    NVIDIA CUDA: YES (ver 11.3, CUFFT CUBLAS FAST_MATH)

    NVIDIA GPU arch: 75 80 86

    NVIDIA PTX archs:

    cuDNN: YES (ver 8.4.0)

  • 点击[Open Project],会自动打开vs2019,开始编译

2.2 VS2019编译OpenCV

  • 使用VS2019打开刚刚编译工程后,等待左下角显示的项全部加载完毕才可以继续操作

  • 选择Release x64版本

    在这里插入图片描述

  • 找到解决方案资源管理器中的“CmakeTargets”下的“ALL_BUILD”,右键→“生成”,然后开始漫长的等待……

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nNqwu0Ta-1655631459263)(E:\software\opencv\opencv编译GPU\image-20220616221804612.png)]

  • 解决方案资源管理器—>CMakeTargets—>INSTALL—>生成”然后又是等,好在这次时间很短。完成后你的build文件夹中会出现一个install文件夹,这就是完成了。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fVI9AP2K-1655631459263)(E:\software\opencv\opencv编译GPU\image-20220617072231198.png)]

2.3 生成文件

  • 生成完成后会出现如下文件夹

    D:\opencv\oepncv4.5.0cuda\build\install

  • build/install目录的目录结构(部分)
    ├─etc
    ├─include
    │ └─opencv2
    │ ├─core
    │ ├─cudalegacy
    │ ├─cudev
    │ ├─datasets
    │ ├─dnn
    │ ├─face
    │ ├─features2d
    └─x64
    └─vc16
    ├─bin
    └─lib

  • tips:在当前目录中运行cmd,使用tree命令,即可生成目录树

D:\opencv\oepncv4.5.0cuda\build\install>tree

3. 测试

3.1 配置OpenCV with cuda

  • 配置OpenCV4.5.0cuda,与一般OpenCV的配置方法一致,可参考:
  • Win7系统Visual Studio 2013配置OpenCV3.1图文详解

3.2 YOLOv4 示例程序

  • 测试程序可以直接用《OpenCV4机器学习算法原理与编程实战》书中的代码(部分):
#include<opencv2\opencv.hpp>
#include<opencv2\dnn.hpp>
#include<fstream>
#include<iostream>

using namespace std;
// 检测结果后处理
void postProcess(
	cv::dnn::Net& net,
	cv::Mat& frame,
	const vector<cv::Mat>& outs,
	vector<cv::Rect>& boxes,
	vector<int>& classIds,
	vector<int>& indices,
	double confThreshold,
	double nmsThreshold
);

// 检测绘制结果
void drawPred(
	cv::Mat& frame,
	vector<cv::Rect>& boxes,
	vector<int>& classIds,
	vector<int>& indices,
	vector<string>& classNamesVec);

// 程序设置
bool USE_IMAGE = false;  // true: 测试图像; false: 测试视频
bool USE_YOLOv4 = true; // true: YOLOv4;   false: YOLOv4_tiny
bool USE_CUDA = true; // true: GPU, false: CPU

float confidenceThreshold = 0.3; // 置信度设置
float nmsThreshold = 0.2; 		  // 置信MNS门限

int main()
{
	// [1]模型文件路径设置
	cv::String model, config;
	if (USE_YOLOv4)
	{
		model = "D:/models/yolov4/yolov4.weights"; // 模型权重文件
		config = "D:/models/yolov4/yolov4.cfg";    // 模型配置文件 
	}
	else // use yolov4-tiny
	{
		model = "D:/models/yolov4/yolov4-tiny.weights";
		config = "D:/models/yolov4/yolov4-tiny.cfg";
	}
	cv::String framework = "Darknet";                     // 深度学习框架
	cv::String label_file = "D:/models/yolov4/coco.names";// 类别标签文件

	//[2] 加载类别
	ifstream classNamesFile(label_file);
	vector<string> classNamesVec;
	if (classNamesFile.is_open())
	{
		string className = "";
		while (std::getline(classNamesFile, className))
		{
			classNamesVec.push_back(className);
		}
	}
	// [3]载入模型
	cv::dnn::Net net = cv::dnn::readNet(config, model, framework);

	if (USE_CUDA)
	{
		net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);
		net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
	}
	else
	{		
		net.setPreferableTarget(cv::dnn::DNN_TARGET_OPENCL);
		net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);
	}

	// ...
	}

4. 相关链接

  • OpenCV4机器学习算法原理与编程实战(附部分模型下载地址)
  • 本文更新链接
  • 转载请注明出处。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

windows11编译OpenCV4.5.0 with CUDA(附注意事项) 的相关文章

  • cuda中有模板化的数学函数吗? [复制]

    这个问题在这里已经有答案了 我一直在寻找 cuda 中的模板化数学函数 但似乎找不到 在普通的 C 中 如果我调用std sqrt它是模板化的 并且将根据参数是浮点数还是双精度数执行不同的版本 我想要这样的 CUDA 设备代码 我的内核将真
  • CUDA 矩阵加法时序,按行与按行比较按栏目

    我目前正在学习 CUDA 并正在做一些练习 其中之一是实现以 3 种不同方式添加矩阵的内核 每个元素 1 个线程 每行 1 个线程和每列 1 个线程 矩阵是方阵 并被实现为一维向量 我只需用以下命令对其进行索引 A N row col 直觉
  • CUDA - 将 CPU 变量传输到 GPU __constant__ 变量

    与 CUDA 的任何事情一样 最基本的事情有时也是最难的 所以 我只想将变量从 CPU 复制到 GPUconstant变量 我很难过 这就是我所拥有的 constant int contadorlinhasx d int main int
  • 通过 cuFFT 进行逆 FFT 缩放

    每当我使用 cuFFT 绘制程序获得的值并将结果与 Matlab 的结果进行比较时 我都会得到相同形状的图形 并且最大值和最小值位于相同的点 然而 cuFFT 得到的值比 Matlab 得到的值大得多 Matlab代码是 fs 1000 s
  • 如何运行和理解CUDA Visual Profiler?

    我已经设置了 CUDA 5 0 并且我的 CUDA 项目运行良好 但我不知道如何使用 Visual Profiler 分析我的 CUDA 项目 如何运行它 我还需要安装更多吗 又该如何做呢 我的电脑使用Window 7 64位 CUDA 5
  • CUDA:获取数组中的最大值及其索引

    我有几个块 每个块在整数数组的单独部分上执行 举个例子 块一从 array 0 到 array 9 块二从 array 10 到 array 20 我可以获得每个块的数组最大值的索引的最佳方法是什么 示例块一 a 0 到 a 10 具有以下
  • CUDA 5.0错误LNK2001:cuda方法无法解析的外部符号

    我的链接器有错误 1 gt ManifestResourceCompile 1 gt All outputs are up to date 1 gt kernel cu obj error LNK2001 unresolved extern
  • CUDA NSight 未随 Windows 8 上的 CUDA 5.0 安装文件一起安装? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 据我所知 Nvidia 网站上没有 Nsight Eclipse 的下载链接 它说它将由 CUDA 5 安装本机安装 但并没有随CUDA安装一起安装
  • 为什么 cuCtxCreate 返回旧上下文?

    我已经安装了 CUDA SDK 4 2 64 CUDA工具包4 2 64 CUDA 驱动程序 4 2 64 我检查了 windows 中的每个 nvcuda dll 所有这些都是 4 2 版本 但是当我使用驱动程序 api 创建上下文并使用
  • 用于计算邻居列表的最佳 GPU 算法

    给定 3D 中数千个点的集合 我需要获取落在某个截止值 以欧几里得距离而言 内的每个粒子的邻居列表 并且如果可能的话 从最近到最远排序 在 CUDA 或 OpenCL 语言中 哪种 GPU 算法最快 我所知道的最快的 GPU MD 代码之一
  • CUDA计算能力2.0。全局内存访问模式

    CUDA 计算能力 2 0 Fermi 全局内存访问通过 768 KB L2 缓存进行 看起来 开发人员不再关心全局内存库 但全局内存仍然非常慢 因此正确的访问模式很重要 现在的重点是尽可能多地使用 重用 L2 我的问题是 如何 我将感谢一
  • 设备内存刷新cuda

    我正在运行一个 C 程序 其中调用了两次 cuda 主机函数 我想清理这两个调用之间的设备内存 有没有办法可以刷新 GPU 设备内存 我使用的是计算能力为2 0的Tesla M2050 如果你只想将内存归零 那么cudaMemset可能是最
  • NVCC 警告级别

    我希望 NVCC 将以下警告视为错误 warning calling a host function foo from a host device function bar NVCC 文档 NVIDIA CUDA 编译器驱动程序 NVCC
  • 在 CUDA 中的设备内存上分配 2D 数组

    如何在 Cuda 中的设备内存中分配和传输 往返于主机 2D 数组 我找到了解决这个问题的方法 我不必展平阵列 内置的cudaMallocPitch 函数完成了这项工作 我可以使用以下命令将阵列传输到设备或从设备传输阵列cudaMemcpy
  • CUDA-Kernel 应该根据块大小动态崩溃

    我想做稀疏矩阵 密集向量乘法 假设用于压缩矩阵中条目的唯一存储格式是压缩行存储 CRS 我的内核如下所示 global void krnlSpMVmul1 float data mat int num nonzeroes unsigned
  • 如何从C++头文件调用CUDA文件?

    我知道从 c 文件调用 cu 文件的方法 但现在我想从 C 头文件调用 cu 文件 有可能做到吗 如果是这样 我应该如何设置我的项目 请帮忙 这是一个有效的例子 file1 h int hello file2 h include
  • 为什么使用 boost::none 无法通过 nvcc 编译?

    我正在尝试编译以下代码 include
  • 如何从尖点库矩阵格式获取原始指针

    我需要从尖点库矩阵格式获取原始指针 例如 cusp coo matrix
  • 将 cuda 数组传递给 Thrust::inclusive_scan

    我可以对 cpu 上的数组使用包容性扫描 但是否可以对 gpu 上的数组执行此操作 注释是我知道有效但我不需要的方式 或者 是否有其他简单的方法可以对设备内存中的数组执行包含扫描 Code include
  • 为什么在 CUDA 中启动 32 倍数的线程?

    我参加了 CUDA 并行编程课程 并且看到了许多 CUDA 线程配置的示例 其中通常将所需的线程数四舍五入到最接近的 32 倍数 我知道线程被分组为 warp 并且如果您启动 1000 个线程 GPU 无论如何都会将其四舍五入到 1024

随机推荐

  • Linux系列讲解 —— 对装有Ubuntu18.04系统的硬盘进行数据迁移

    目录 0 背景介绍1 参照旧硬盘的分区对新硬盘进行分区2 将旧硬盘分区数据迁移到新硬盘对应分区中补充 xff1a 1 新硬盘启动有问题时的对策 需要启动U盘 0 背景介绍 现有一块装有ubuntu系统的旧硬盘 sda xff0c 电脑主机的
  • GPG错误:没有公钥无法验证签名的解决办法

    GPG错误 xff1a 没有公钥无法验证签名的解决办法 sudo apt key adv keyserver hkp keyserver ubuntu com 80 recv 后面加入密钥 xff0c 就能导入公钥了
  • linux中添加环境变量

    linux中添加环境变量 一般是在 etc profile中添加环境 xff0c 但是建议在 etc profile d 下创建一个以 sh结尾的文件 vim etc profil d my env sh 输入i进入编辑模式 eg xff1
  • snprintf函数用法及与sprintf比较

    int snprintf char restrict buf size t n const char restrict format 函数说明 最多从源串中拷贝n xff0d 1个字符到目标串中 xff0c 然后再在后面加一个0 所以如果目
  • gin跨域时Get,Post正常Put,Delete被阻止的问题解决

    问题表现 同一个项目请求同一个服务时 xff0c Get和Post请求正常 xff0c 但是Put和Delete一直报跨域错误的问题 Access to XMLHttpRequest at 39 http 127 0 0 1 8011 ap
  • iOS绘制仪表盘,游标沿圆形轨迹移动动画

    最近碰到一个需求 xff0c 需要画一个仪表盘的页面 图上所示 计算角度 圆弧部分还好 xff0c 用CAShapeLayer 43 UIBezierPath曲线 xff0c 只要确定好圆心部分和左右两边的角度就行 这里正好说明一下 voi
  • [iOS] 如何改变一个控制器的大小?

    iOS 如何改变一个控制器的大小 1 改变控制器的VIew大小 这是只能改变控制器里面View的大小 并不会对控制器本身的显示做出视觉改变 2 改变控制的大小 方法 span class hljs comment 重置控制器的大小 span
  • 控件:UIControl 我在UITextFiled输入事件调用到

    下列事件为基类UIControl所支持 xff0c 除非另有说明 xff0c 也适用于所有控件 UIControlEventTouchDown 单点触摸按下事件 xff1a 用户点触屏幕 xff0c 或者又有新手指落下的时候 UIContr
  • iOS抖音点赞动画实现

    前言 hi 大家好 又跟大家见面了 今天给大家分享的是抖音的点赞动画的实现 废话不多说上图 本篇文章主要包含技术点 CAShapeLayer和贝赛尔曲线绘制三角形 组合动画的时间技巧我习惯写完文章的demo都附在文章底部 如果不想看原理的小
  • 必读!!只需10分钟,NAS变身赚钱神器!

    有很多朋友现在家里都有NAS xff0c 今天教大家如何利用NAS的闲置资源薅羊毛 NAS我们正常的用途是存储资料 xff0c 通过网络传输实现多设备文件互通 xff0c 但是在大部分情况下 xff0c 我们的宽带和NAS机能处于闲置状态
  • 如何利用电脑榨干闲置的带宽资源?

    电脑现在是每个家庭的必需品 xff0c 大部分人对电脑的使用方法主要是办公和游戏 xff0c 除了这两个用途外 xff0c 其实大部分人的电脑是处于闲置状态 那么 xff0c 电脑的闲置闲置时间还能做些什么呢 xff1f 今天给大家介绍一个
  • 如何善用家中闲置的带宽资源赚钱(2020版)

    CDN的全称是Content Delivery Network xff0c 即内容分发网络 xff0c 依靠部署在各地的边缘服务器 xff0c 通过中心平台的负载均衡 内容分发 调度等功能模块 xff0c 使用户就近获取所需内容 xff0c
  • 一招将闲置宽带完美利用起来

    随着我们生活水平的提高以及国家对信息化建设的推动 xff0c 大部分家庭的宽带已经进入了高速时代 xff0c 100 200M到处可见 xff0c 甚至于500M也不是什么新鲜事儿了 xff0c 宽带的速率是提高了 xff0c 不过问题也来
  • 十一、 Debian忘记密码重置

    其方式是在GRUB引导菜单下按 e 进入编辑模式直接修改用户密码 重启VPS xff0c 可以在面板重启也可以在VNC上面使用发送 CTRL 43 ALT 43 DEL 按钮直接重启 xff0c 在图示处按 e 键 xff08 若出现BIO
  • 加入共享宽带,让你的闲置宽带循环利用再变现

    共享经济是近些年来发展的一个热点名词 xff0c 因此大家也会看到一些非常多的共享产品出现在市面上 比如说大家熟悉的共享单车 xff0c 共享汽车共享充电宝等等 xff0c 但是不知道大家有没有听说过共享宽带呢 xff1f 宽带几乎是家家户
  • 一招让NAS自给自足

    网络带来了许多便利 xff0c 但又给生活带来了很多烦恼 xff0c 比如微信文档总是过期 xff0c 关键内容经常找不到 xff0c 照片备份太散乱 最近听朋友说听说前任离婚了 xff0c 我突然想重温下与她昨日的温情 xff0c 可是翻
  • 百度网盘撸用户羊毛是怎么一回事

    最近百度网盘事件闹得沸沸扬扬 xff0c 很多吃瓜小伙伴对这次事件的来龙去买不太清楚 xff0c 今天就给大家八一八百度网盘如何反撸用户引发众怒 百度对于该计划的说明 xff1a 用户参加该计划可贡献闲置网络带宽和电脑存储空间给百度 xff
  • 业务流程节点信息提示

    xfeff xfeff 该模块中主要是为了明确用户操作 让用户具体的知道该进行哪一步操作 xff0c 在登陆系统后 xff0c 系统首页中会有下面类似的流程图 xff1a 当用户完成一项操作后 xff0c 要根据流程提示其他用户进行下一步操
  • UbuntuWSL操作PA的BUG记录——AM_HOME环境变量的设定

    2021年5月更 xff0c 发现WSL2是真的香 xff0c 下次还用 x1f604 2021年4月 血亏 xff0c 建议老实用虚拟机做 xff0c WSL还是有很多未完善的地方 xff0c 不适合新手瞎折腾 问题描述 xff1a 当使
  • windows11编译OpenCV4.5.0 with CUDA(附注意事项)

    windows11编译OpenCV4 5 0 with CUDA 从OpenCV4 2 0 版本开始允许使用 Nvidia GPU 来加速推理 本文介绍最近使用windows11系统编译带CUDA的OpenCV4 5 0的过程 文中使用 特