【OpenCV】 OpenCV 源码编译并实现 CUDA 加速 (Windows)

OpenCV 源码编译并实现 CUDA 加速 Windows

  • 1. 环境准备
    • 1.1 软件环境
    • 1. 2 源码下载
  • 2. CMake编译项目
    • 2.1 创建cmake项目
    • 2.2 设置编译配置
    • 2.3 解决异常
      • 2.3.1 文件下载异常
      • 2.3.2 解决CUDA版本异常
    • 2.4 编译项目
  • 3. Visual Studio 编译项目
  • 4. 项目测试
  • 5. 总结

  OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。项目源码由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

  但在实际使用中,如果是对处理时间要求比较高的场景,使用OpenCV处理图片数据很难满足要求,不过OpenCV支持使用CUDA进行加速,不过支持CUDA加速的依赖包需要我们自行编译才可使用,因此在本次文章中,我们将演示如何使用OpenCV源码自行编译代码文件,来实现CUDA加速。

1. 环境准备

1.1 软件环境

  本次编译平台使用的是 Windows 11 系统,使用CMake-gui + VS2022进行源码编译,为了大家更好的复现该项目,此处罗列一下本文所使用的环境:

  • CUDA: 12.2, cudnn: 8.9.3
  • Cmake: 3.28.0
  • Visual Studio 2022

关于以上环境的安装,大家可以查看网上相关文档自行安装即可。

1. 2 源码下载

  接下来需要下载OpenCV源码,此处需要下载两个源码,分别是opencvopencv_contrib。下载链接为

opencv:
https://github.com/opencv/opencv/archive/4.8.0.zip
opencv_contrib:
https://github.com/opencv/opencv_contrib/tags

  不过在下载时要注意一点,就是要保证opencvopencv_contrib下载的版本要一致,此处我们下载的版本为:4.8.0。下载完成后,将两个文件解压到同一个文件夹中,如下图所示。
在这里插入图片描述

2. CMake编译项目

2.1 创建cmake项目

  打开CMake软件,设置项目源码路径,并在源码路径下创建一个build文件夹,并设置编译文件夹,如下图所示:

在这里插入图片描述

  接下来点击Configure,进行第一次配置,然后回弹出编译平台选择,此处根据自己电脑的编译软件进行选择,在本文中我们使用的是Visual Studio 2022,然后选择编译平台为x64
在这里插入图片描述

  第一次配置生成后,输出如下所示:

在这里插入图片描述

2.2 设置编译配置

  首先添加opencv_contrib模块的引用,在OPENCV_EXTRA_MODULES_PATH条目中添加该模块的路径,然后选择OPENCV_ENABLE_NONFREE,如下图所示:

在这里插入图片描述

  接下来添加CUDA的设置,首先选择WITH_CUDA,如下图所示:

在这里插入图片描述

  然后选择OPENCV_DNN_CUDA,此处还可以选择OPENCV_DNN_OPENVINO等不同的模型部署,如下图所示:

在这里插入图片描述

  最后选择ENABLE_FAST_MATH

在这里插入图片描述

  此处为了让生成的依赖库文件都集成在一个文件中,方便后面使用,所以此处可以选择BUILD_opencv_world,如果不选择,生成的 文件将会被拆散成多个文件。

在这里插入图片描述

  第二次Configure后,下一步就是需要检查一下其过程是否有异常抛出

在这里插入图片描述

2.3 解决异常

2.3.1 文件下载异常

  首先查看一下配置输出框是否抛出警告,如果有的话,一定要解决一下,不然后续编译会出错。
在这里插入图片描述

  当出现上图所示的异常后,就需要手动解决一下该问题,首先找到```build\CMakeDownloadLog.txt``文件,然后打开后,查看一下是否有下图所示的文件确实异常。如果有,请自行下载,下载链接如下图所示标注位置,下载后将文件放置在下图所示缺失文件路径,并按照要求修改名称。

在这里插入图片描述

2.3.2 解决CUDA版本异常

  该异常会在最后编译过程中出现,主要是当CUDA>=12.2时会出现该问题,因此需要检查一下自己的CUDA版本是否大于12.2.查看``CUDA··版本方式如下图所示。

在这里插入图片描述

  如果你的CUDA版本大于12.2,就要根据官方的要求进行修改,官方提供的解决方式链接为:cuda: fix for compatibility with CUDA Toolkit >= 12.2.0 by cudawarped · Pull Request #24104 · opencv/opencv (github.com)。

其主要修改内容如下图所示。

在这里插入图片描述

2.4 编译项目

  解决完上述异常后,就可以进行项目编译了,点击Generate,就可以自动生成项目了。

在这里插入图片描述

3. Visual Studio 编译项目

  首先我们打开build\文件夹,可以看到生成的OpenCV.sln解决方案文件,使用Visual Studio打开该项目。
在这里插入图片描述

  然后运行ALL_BUILD项目即可,此处运行时间会比较长,尤其是再加入CUDA支持后,编译时间会更久。

在这里插入图片描述

  编译完成后,可以获得下面文件夹内容,此处主要是两个有用的文件夹,一个是install文件夹,这个文件夹主要是包含的时项目运行的依赖项,包括include/文件夹以及 .lib.dll等文件;第二个是python_loader文件夹,主要是python运行所需的依赖项。

在这里插入图片描述

4. 项目测试

  项目编译完成后,最后我们查看一下项目是否编译成功,此处使用cv2.cuda.getCudaEnabledDeviceCount()接口方法检查一下是否存在在线的CUDA设备,如果存在CUDA设备,将返回设备数量,如果没有,将返回0。如下图所示,在运行后,输出为1,本机设备只存在一个显卡,所以索命该项目已经编译好了。

在这里插入图片描述

5. 总结

  在本文中,我们实现了OpenCV源码编译,并结合本机安装的CUDA版本,实现了CUDA版本的OpenCV编译,并实现了Python API 以及C++ API 的使用。后续我们将会结合所编译的库进行项目开发以及与普通版本进行对比。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/228556.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 常用命令之 ln 命令用法介绍

ln命令在Ubuntu系统中用于创建硬链接或符号链接。硬链接是指向文件的物理地址,而符号链接(也称为软链接)是指向文件路径的引用。 命令格式:ln [选项]... [-T] 目标(源文件) 链接(目标文件&…

【FPGA】Verilog:编码器 | 实现 4 到 2 编码器

0x00 编码器(Encoder) 编码器与解码器相反。当多台设备向计算机提供输入时,编码器会为每一个输入生成一个与设备相对应的信号,因此有多少比特就有多少输出,以数字形式表示输入的数量。 例如,如果有四个输…

NAS搭建WebDAV服务同步Zotero科研文献

文章目录 一、Zotero安装教程二、群晖NAS WebDAV设置三、Zotero设置四、使用公网地址同步Zotero文献库五、使用永久固定公网地址同步Zotero文献库 Zotero 是一款全能型 文献管理器,可以 存储、管理和引用文献,不但免费,功能还很强大实用。 ​ Zotero 支…

重新认识Word——尾注

重新认识Word——尾注 参考文献格式文献自动生成器插入尾注将数字带上方括号将参考文献中的标号改为非上标 多处引用一篇文献多篇文献被一处引用插入尾注有横线怎么删除?删除尾注 前面我们学习了如何给图片,公式自动添加编号,今天我们来看看毕…

LSTM ——作业

习题6-4 推导LSTM网络中参数的梯度, 并分析其避免梯度消失的效果 习题6-3P 编程实现下图LSTM运行过程 1. 使用Numpy实现LSTM算子 import numpy as np # 创建一个numpy数组x,它是一个4x4的矩阵,包含9个元素 x np.array([[1, 0, 0, 1],[3, …

Unity中URP下的菲涅尔效果实现(URP下的法线和视线向量怎么获取)

文章目录 前言一、实现思路二、实现原理我们可以由下图直观的感受到 N 与 L夹角越小,点积越接近(白色)1。越趋近90,点积越接近0(黑色) 三、实现URP下的菲涅尔效果1、我们新建一个Shader,修改为最…

安全密码(字符串)

#include <stdio.h> #include <stdbool.h> #include <string.h> bool is_secure_password(const char* password); int main() {int M;char password[51];// 读取输入中的密码数量 Mscanf("%d", &M);// 处理每个密码for (int i 0; i < M; …

Pytorch:Tensorboard简要学习

目录 一、TensorBoard简介二、TensorBoard的安装与启动Tensorboard的安装Tensorboard的启动 三、TensorBoard的简单使用3.1 SummaryWriter()3.2 add_scalar()和add_scalars()3.3 add_histogram()3.4 模型指标监控 四、总结参考博客 一、TensorBoard简介 TensorBoard 是Google开…

17.Oracle中instr()函数查询字符位置

1、instr()函数的格式 &#xff08;俗称&#xff1a;字符查找函数&#xff09; 格式一&#xff1a;instr( string1, string2 ) // instr(源字符串, 目标字符串) 格式二&#xff1a;instr( string1, string2 [, start_position [, nth_appearance ] ] ) // instr(源字符…

typescript使用解构传参

看下面这个函数 interface Student {id: number;name: string;class: string;sex: string;}function matriculation(student: Student) {//...}我们要调用它,就需要传递一个实现了Student约束的对象进去 interface Student {id: number;name: string;class: string;sex: string…

C语言:将三个数从大到小输出

#include<stdio.h> int main() {int a 0;int b 0;int c 0;printf("请输入abc的值&#xff1a;");scanf_s("%d%d%d", &a, &b, &c);if (b > a){int tmp a;a b;b tmp;}if (c > a){int tmp a;a c;c tmp;}if (b < c){int t…

app分发平台哪个好点?手机app应用内测分发平台支持负载均衡的重要性

随着互联网的快速发展&#xff0c;内测分发平台扮演着越来越重要的角色。而在现代应用程序的开发和运营过程中&#xff0c;负载均衡技术是不可或缺的一部分。内测分发平台支持负载均衡对于提高系统的稳定性、可靠性和性能至关重要。那么什么是负载均衡又有哪些重要性。 图片来源…

在线学习平台,云课堂云教育类网站源码,在线题库+随身携带的刷题神器+视频安装教程

源码介绍 在线题库&#xff1a;由传统的线下学习模式改为在线学习。能够实现学员在线学习、练习、考试 优点&#xff1a;方便、便宜、自我管理、选择性更多 、成人教育 &#xff08;1&#xff09;公考&#xff1a;国考、省考、事业单位… &#xff08;2&#xff09;升学&…

数据结构期末考题之001

算法复杂度就是n&#xff08;0&#xff09;

C++ Qt开发:自定义Dialog对话框组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍自定义Dialog组件的常用方法及灵活运用。 在…

【上海大学数字逻辑实验报告】七、中规模元件及综合设计

一、实验目的 掌握中规模时序元件的测试。学会在Quartus II上设计序列发生器。 二、实验原理 74LS161是四位可预置数二进制加计数器&#xff0c;采用16引脚双列直插式封装的中规模集成电路&#xff0c;其外形如下图所示&#xff1a; 其各引脚功能为&#xff1a; 异步复位输…

在做题中学习(33):只出现一次的数字 II

137. 只出现一次的数字 II - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 1.首先想到出现三次的数&#xff0c;它们仨的任意一位都是相同的&#xff08;1/0&#xff09; 2.可以发现出现三次的数的某一位和a某一位在所有情况下%3最后的结果都和a的那一位相同&…

PMP项目管理 - 风险管理

系列文章目录 PMP项目管理 - 质量管理 PMP项目管理 - 采购管理 PMP项目管理 - 资源管理 PMP项目管理 - 风险管理 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in…

Java技术栈 —— Log4j 2、Logpack、SLF4j日志框架介绍

Log4j 2、Logpack、SLF4j日志框架介绍 Log4j 2、Logpack、SLF4j日志框架&#xff0c;及其区别1.1 Log4j 21.1.1 日志级别1.1.2 日志输出目标位置1.1.3 日志刷新机制1.1.4 结构化打印日志1.1.5 异步打印日志1.1.6 在Cloud云环境汇集日志信息 1.2 LogPack1.3 SLF4j1.4 区别 Log4j…

从数据应用案例出发,探索2024年及未来的数据科学转型

如今&#xff0c;数据科学已经取得了长足的进步&#xff01;回顾数据科学的发展史&#xff0c;19世纪&#xff0c;人们使用基本统计模型收集、存储和处理数据。后来&#xff0c;当计算机进入万千家庭&#xff0c;数字时代正式到来&#xff0c;并由此产生了大量数据。互联网上数…