opencv+opencv_contrib+cuda和VS2022编译
本文介绍使用OpenCV和OpenCV_Contrib源码及Cuda进行编译的过程,编译过程中会用到OpenCV、OpenCV_Contrib、CUDA Toolkit、cuDNN、Cmake、VS2022等工具,最终编译OpenCV的Cuda版本。
一、OpenCV下载地址
OpenCV官网下载地址:https://opencv.org/releases/#,选择一个版本下载,下载之后解压或者提取;
OpenCV Gihthub下载地址:https://github.com/opencv/opencv;也可以在Github选择一个版本下载,下载之后解压;
注:从官网使用下载器下载的OpenCV解压后会多一个build文件夹,是已经编译的opencv文件,直接从Github下载的没有这个文件夹,因为需要自己编译Cuda版本的opencv,所以不会用到这个build文件夹,有没有都不影响;
图中左侧opencv4.11.0文件夹就是右侧的sources文件夹(下图)
二、OpenCV_contrib下载地址
OpenCV Gihthub下载地址:https://github.com/opencv/opencv_contrib,和下载OpenCV相同的方式进行下载,注意OpenCV_contrib的版本要与下载的OpenCV的版本一致。下载后解压;
下图中的cuda开头的文件夹就是与cuda相关的文件,
三、Cmake下载
下载Cmake:https://cmake.org/download/,我使用的Cmake4.0.1;
四、Cuda Toolkit下载
1.查看CUDA最高支持版本
在命令窗口中使用nvidia-smi查看电脑的显卡支持的CUDA Toolkit版本(如果nvidia-smi不可用,可能是命令行输错了或者没安装显卡驱动,检查命令行或者下载驱动:https://www.nvidia.cn/drivers/lookup/),下图中CUDA Version12.6代表最高支持CUDA Toolkit12.6的版本;
2.下载CudaToolkit
下载地址:https://developer.nvidia.com/cuda-downloads,下载完成后,进行安装,安装后
在C:\Program Files会有NVIDIA GPU Computing Toolkit文件夹;
3.环境变量配置
安装完成后,系统环境变量中会有以下两个路径;
在环境变量Path中,需要添加以下路径(前两个是安装后自动添加的,所以只需要添加最后一个x64的路径就行):
4.检查CUDA Toolkit版本
在命令窗口输入 nvcc -V(中间有空格)会显示电脑安装的CUDA Toolkit的版本号;
五、cuDNN下载
下载地址:https://developer.nvidia.com/cudnn,下载完成后,将其中的bin文件,lib文件夹,include文件夹,三个文件夹中的文件复制到对应的cuda文件夹中,即C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2文件夹的对应目录中(v12.2是CUDA的版本号,我下载的是12.2),如果不使用cuDNN可以跳过此步骤;
六、编译
1.opencv编译
1.打开Cmake,首先编译opencv,选择Opencv源码文件夹,之后选择新的build文件夹,如下图新建一个build文件夹,我的build文件夹名字为cudaopencv1:
点击左下角的Configure,会弹出以下界面,选择generator,我需要使用的是VS2022,所以我选择的是Visual Studio 17 2022(根据自己的需求选择),之后点击Finish:
2.Configure完成后会有以下界面,Configure过程中会显示warning,提示你cmake版本要求或者文件未找到,可以一个一个查看,不是自己需编译的文件就不用管(也可以直接取消勾选,不进行编译);
3.点击Generate,下方会显示Generating done.
4.至此build文件夹(我的build文件夹名为cudaopencv1)中会出现以下文件:
2.OpenCV生成
1.双击打开生成的OpenCV.sln,
2.在VS中设置编译环境Debug或者Release,之后在解决方案管理器中找到CmakeTargerts,右键点击其中的ALL_BUILD,点击生成;
3.在自己的build文件夹中会生成lib文件夹,如下所示
lib文件夹中的内容是刚刚生成的文件,如果是在Debug模式下生成就会有Debug文件夹,如果是Release模式就会有Release文件夹,两种模式都生成,两个文件夹都有;
文件夹中是生成的库文件:
3.编译contrib及CUDA
1.在Cmake中找到OPENCV_EXTRA_MODULES_PATH,设置文件夹为opencv_contrib文件中的modules文件夹路径,我的opencv_contrib路径为:D:/OpenCV4.11/opencv_contrib-4.11.0/modules,如下图:
2.在cmake的search中输入cuda,设置BUILD中的BUILD_CUDA_STUBS为勾选状态,设置WITH中的WITH_CUDA为勾选状态;
3.设置完成后,点击下方的Configure,最下方显示Configuring done.
4.完成Generate之后设置显卡算力参数,在Cmake的Search中搜索ARCH,设置CUDA_ARCH_BIN参数为自己的显卡算力,我的显卡算力为8.6,具体自己的显卡算力可以在Nvidia网站查询:https://developer.nvidia.com/cuda-gpus;
注意:在未点击Generate时搜索不到这个参数,完成一次Generate后才可以搜到这个参数,如果不设置这个参数会导致后边的cudaopencv编译失败;
5.设置CUDA_FAST_MATH为勾选状态:
点击Configure,显示Configuring done后,点击Generate,Generating done
6.检查是否编译成功
a.在Camke的白色区域中,Build中会显示以下目录:
b.在自己的build文件夹中的modules文件夹中(我的build文件夹名字为cudaopencv1),会有以下文件,
至此opencv cuda版本的build完成。
4.使用VS进行生成
打开build文件夹(cudaopencv1),找到OpenCV.sln,双击打开;
在CmakeTargets中找到ALL_BUILD,右键点击生成(此过程比较长,我用了18分钟),
生成完成后,查看自己的build文件夹的lib文件夹,发现与之前相比会多出contrib中的内容
之后点击INSTALL中的仅用于项目的仅生成INSTALL,点击后会在build文件夹中生成一个install文件夹,文件夹中的内容就是编译的全部内容。
install文件夹中的内容:
这里边都是debug模式下编译的库文件,如果需要release模式,在ALL_BUILD生成时,在VS中选择Release,然后再生成INSTALL。
至此,opencv +contrib+cuda编译全部完成。
七、配置及使用
1.配置环境变量
在此电脑->属性->高级系统设置->环境变量->系统变量->Path中增加编译的bin文件夹;
2.配置项目属性
首先配置项目包含目录,在包含目录中添加:D:\OpenCV4.11\cudaopencv1\install\include 和 D:\OpenCV4.11\cudaopencv1\install\include\opencv2;
在库目录中,配置D:\OpenCV4.11\cudaopencv1\install\x64\vc17\lib
在链接器->输入->附加依赖项中,加入build文件夹中所有lib文件名称,文件名很多,所以可以使用命令行一次性全部转换为文本,然后直接复制(详见3.获取所有lib文件名称)
3.获取所有lib文件名称
在命令窗口中输入:dir /b “文件路径”>生成的文本路径;
例如以下截图,会将lib文件夹中的所有文件名字存放到C盘的name文本中;
4.验证是否可用
使用以下代码可以获取编译信息及电脑的GPU数量,则可以正常使用;
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/cudafilters.hpp>
#include <opencv2/cudaimgproc.hpp>
int main()
{std::cout << "OpenCV built with CUDA: " << cv::getBuildInformation() << std::endl;//获取编译信息,如下图int num_devices = cv::cuda::getCudaEnabledDeviceCount();//获取电脑显卡数量std::cout << "Number of CUDA devices: " << num_devices << std::endl;return 0;
}
如果编译正常,使用getBuildInformation()函数可以看到NVIDIA CDUA的状态为YES,而且可以看到显卡的计算能力;
使用cuda::getCudaEnabledDeviceCount()可以获取到电脑的显卡数量(如下图,电脑只有一个显卡,获取的结果也是1);
八、汇总
使用的编译工具及版本如下,如果有需要编译完成的文件,可以在评论区留下邮箱;
九、编译过程中可能遇到的问题
1.所有步骤均按照以上过程操作,但是在VS生成过程中,显示:
27>D:\OpenCV4.5.5\opencv\sources\modules\core\include\opencv2/core/cuda/common.hpp(99,27): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int (编译源文件D:\OpenCV4.5.5\opencv\cudaopencv\modules\core\arithm.sse4_1.cpp)
产生这个问题大概率是由于cuda版本与opencv版本的兼容问题,我最开始使用OpenCV4.5.5和CUDA 12.2版本,出现这个问题,后来换成OpenCV4.11和CUDA12.2,编译成功
2.在Cmake过程中出现以下错误,显示:
CMake Error at cmake/OpenCVDetectCUDAUtils.cmake:297 (list):
list GET given empty list
Call Stack (most recent call first):
cmake/OpenCVDetectCUDA.cmake:76 (ocv_set_cuda_arch_bin_and_ptx)
cmake/OpenCVFindLibsPerf.cmake:46 (include)
CMakeLists.txt:800 (include)
cmake检测CUDA架构时未能正确识别电脑GPU的计算能力,如果出现这个问题,在cmake中设置CUDA_ARCH_BIN的值,GPU计算能力查询https://developer.nvidia.com/cuda-gpus
相关文章:

opencv+opencv_contrib+cuda和VS2022编译
本文介绍使用OpenCV和OpenCV_Contrib源码及Cuda进行编译的过程,编译过程中会用到OpenCV、OpenCV_Contrib、CUDA Toolkit、cuDNN、Cmake、VS2022等工具,最终编译OpenCV的Cuda版本。 一、OpenCV下载地址 OpenCV官网下载地址:https://opencv.org/releases…...
《深挖Java中的对象生命周期与垃圾回收机制》
大家好呀!👋 今天我们要聊一个Java中超级重要的话题——对象的生命周期和垃圾回收机制。 一、先来认识Java世界的"居民"——对象 👶 在Java世界里,一切皆对象。就像现实世界中的人一样,每个Java对象也有自…...
C++中extern关键字详解:不同情况下的使用方式
在 C 中,extern 关键字主要用于声明变量或函数是在其他文件中定义的,从而可以在当前文件中使用这些变量或函数。下面详细介绍 extern 修饰全局变量、函数等的用法区别以及注意事项。 修饰全局变量 详细介绍 当 extern 用于修饰全局变量时,…...
【QT】深入理解 Qt 中的对象树:机制、用途与最佳实践
深入理解 Qt 中的对象树:机制、用途与最佳实践 在使用 Qt 编程时,你是否注意到很多对象可以设置“父对象”?比如: QPushButton* btn new QPushButton(parentWidget);这不是简单的层级结构,而是 Qt 强大而优雅的 对象…...
如何利用爬虫获得1688商品详情:实战指南
在电商运营和市场分析中,获取1688商品详情数据是一项重要任务。本文将详细介绍如何利用爬虫技术获取1688商品详情,包括准备工作、爬虫实现步骤以及注意事项。 一、准备工作 (一)注册1688开放平台账号 在1688开放平台注册开发者…...

网工实验——OSPF配置
网络拓扑图 配置 1.为每个路由器配置接口(略)(详细见RIP实验) 2.配置OSPF AR1 [AR1]ospf [AR1-ospf-1]area 1 [AR1-ospf-1-area-0.0.0.1]network 172.16.1.1 0.0.0.0 #精确配置网络,也可以像下面那条命令那样配置 …...

数据库系统概论-基础理论
数据库系统概述: 1、记录:计算机中表示和存储数据的一种格式或方法。 2、数据库(DataBase, DB):数据库是长期储存在计算机内、有组织、可共享的大量数据集合。可为各种用户共享。 3、数据库管理系统(Dat…...

从零开始学习人工智能(Python高级教程)Day6-Python3 正则表达式
一、Python3 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。 在 Python 中,使用 re 模块来处理正则表达式。 re 模块提供了一组函数,允许你在字符串中进行模式匹配、搜索和替换操作。 r…...

Qt开发:项目视图(Item Views)的介绍和使用
文章目录 一、清单视图(List View)1.1 基本概念1.2 使用示例(文字列表)1.3 图标文字(图标模式)1.4 常用设置1.5 完整示例 二、树视图(Tree View)2.1 基本概念2.2 常用类简介2.3 快速…...
“ES7+ React/Redux/React-Native snippets“常用快捷前缀
请注意,这是一个常用的列表,不是扩展提供的所有前缀。最完整和最新的列表请参考扩展的官方文档或在 VS Code 中查看扩展的详情页面。 React (通常用于 .js, .jsx, .ts, .tsx): rfce: React Functional Component with Export Defaultrafce: React Arro…...

keepalived详细笔记
keepalived 是一种基于VRRP(虚拟路由器冗余协议)的高可用解决方案,主要是用于服务器的负载均衡和高可用性的保障,自动将服务切换到备份服务器上,确保业务的连续性。 工作原理: VRRP协议:一组路…...

xLua笔记
Generate Code干了什么 肉眼可见的,在Asset文件夹生成了XLua/Gen文件夹,里面有一些脚本。然后对加了[CSharpCallLua]的变量寻找引用,发现它被XLua/Gen/DelegatesGensBridge引用了。也可以在这里查哪些类型加了[CSharpCallLua]。 public over…...

一周学会Pandas2 Python数据处理与分析-Pandas2数据排序操作
锋哥原创的Pandas2 Python数据处理与分析 视频教程: 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili Pandas 2提供了多种灵活的数据排序方法,主要针对 DataFrame 和 Series 对象。 1. 按值排序:s…...
obj = null; 赋值null之前没有其他引用指向obj对象,那么,当obj=null时,会被垃圾回收机制立即回收吗?
不会立即回收。 具体原因是: 赋值 obj null; 后,对象变成“不可达”,符合垃圾回收条件,但垃圾回收器并不会立刻回收它。垃圾回收是CLR自动控制的非确定性过程,什么时候执行回收取决于系统内存压力、GC策略、分代情况…...

lvm详细笔记
LVM简介 逻辑卷管理器,是Linux 系统中用于管理磁盘储存的关键技术。 LVM 则打破了磁盘分区一旦确定,其大小调整往往较为复杂,且难以灵活应对业务变化这种限制,它允许用户将多个物理分区组合卷组。例如,系统中的多个物…...

250505_HTML
HTML 1. HTML5语法与基础标签1.1 HTML5特性1.1.1 空白折叠现象1.1.2 转义字符 1.2 HTML注释1.3 基础标签1.3.1 div标签1.3.2 标题标签1.3.3 段落标签1.3.4 title1.3.5 meta 1.4 html骨架1.4.1 DTD1.4.2 html标签1.4.3 head与body标签 1.5 div标签详解1.5.1 常见class类名 2. 列…...

【HarmonyOS NEXT+AI】问答05:ArkTS和仓颉编程语言怎么选?
在“HarmonyOS NEXTAI大模型打造智能助手APP(仓颉版)”课程里面,有学员提到了这样一个问题: 鸿蒙的主推开发语言不是ArkTS吗,本课程为什么使用的是仓颉编程语言? 这里就这位同学的问题,统一做下回复,以方便…...

【专家库】Kuntal Chowdhury
昆塔尔乔杜里 Kuntal Chowdhury 是 NVIDIA 的 6G 开发者关系经理和技术布道师。他致力于推动与 NVIDIA 平台和工具的开发者和早期采用者生态系统的联系,以促进 6G 研究社区的蓬勃发展。在此之前,他是 BlueFusion, Inc. 的创始人,这是一家创新…...

【代码优化篇】强缓存和协商缓存
强缓存和协商缓存 一、强缓存与协商缓存的区别二、Vue2 前端实现强缓存(静态资源)三、Spring Boot 后端实现协商缓存(动态接口)四、测试缓存效果五、注意事项 一、强缓存与协商缓存的区别 强缓存:浏览器直接读取本地缓…...

电路中的DGND、GROUND、GROUND_REF的区别,VREF、VCC、VDD、VEE和VSS的区别?
目录 1 DGND、GROUND、GROUND_REF的区别 1.1 DGND(Digital Ground) 1.2 GROUND(Ground) 1.3 GROUND_REF(Ground Reference) 1.4 区别 2 VREF、VCC、VDD、VEE和VSS的区别 2.1 VREF(Refere…...
使用AES-CBC + HMAC-SHA256实现前后端请求安全验证
AES-CBC HMAC-SHA256 加密验证方案,下面是该方案二等 优点 与 缺点 表格,适用于文档、评审或技术选型说明。 ✅ 优点表格:AES-CBC HMAC-SHA256 加密验证方案 类别优点说明🔐 安全性使用 AES-CBC 对称加密使用 AES-128-CBC 是可…...
Excel 数据 可视化 + 自动化!Excel 对比软件
各位Excel小能手们!你们有没有过要对比两个Excel表格数据差异,却看得眼睛都花了的经历?其实啊,现在有专门的Excel文件比较软件能帮咱解决这大难题。这软件就是用来快速找出两个或多个Excel表格数据不同之处,还能把修改…...

开始使用WebStorm
目录 开始使用WebStorm打开、检出或创建项目打开项目从版本控制系统检出项目的步骤创建一个空的WebStorm项目在项目中创建新文件的步骤 熟悉WebStorm用户界面找到你要找的代码查找项目符号的调用按名称查找项目符号搜索文本片段转到符号声明历史记录 补全代码实时检查并修复代码…...

【计算机视觉】Car-Plate-Detection-OpenCV-TesseractOCR:车牌检测与识别
Car-Plate-Detection-OpenCV-TesseractOCR:车牌检测与识别技术深度解析 在计算机视觉领域,车牌检测与识别(License Plate Detection and Recognition, LPDR)是一个极具实用价值的研究方向,广泛应用于智能交通系统、安…...

【MongoDB篇】MongoDB的聚合框架!
目录 引言第一节:什么是聚合框架? 🤔第二节:管道的“发动机”们——常用聚合阶段详解!⚙️第三节:聚合表达式——管道中的“计算器”和“转换器” 🧮✏️第四节:性能优化与考量——让…...
洛谷 P1179【NOIP 2010 普及组】数字统计 —— 逐位计算
题面:P1179 [NOIP 2010 普及组] 数字统计 - 洛谷 一:题目解释: 需要求一区间内数字 2 的出现次数。注意22则记为 2 次,其它没别的... 二:思路、 思想可以考虑动态规划需要计算在每一位上数字 2 的出现次数,然后将这些…...
面试常问系列(一)-神经网络参数初始化-之自注意力机制为什么除以根号d而不是2*根号d或者3*根号d
首先先罗列几个参考文章,大家之后可以去看看,加深理解: 面试常问系列(一)-神经网络参数初始化面试常问系列(一)-神经网络参数初始化之自注意力机制_注意力机制的参数初始化怎么做-CSDN博客面试常问系列(一)-神经网络参数初始化-之-softmax-C…...

C++使用PoDoFo库处理PDF文件
📚 PoDoFo 简介 PoDoFo 是一个用 C 编写的自由开源库,专用于 读取、写入和操作 PDF 文件。它适用于需要程序化处理 PDF 文件的应用程序,比如批量生成、修改、合并、提取元数据、绘图等。 🌟 核心特点 特性说明📄 P…...

【Unity】Unity中修改网格的大小和倾斜网格
一、问题 unity中的网格(Grid)或者地面Plane组件,在使用时,都是正方形的网格,而且建立该网格后,在不改变Scale情况下,没发使其整体变大,而且也没法改变每个网格的大小,而…...
SQL 与 Python:日期维度表创建的不同选择
文章目录 一、日期维度表概述日期维度表结构 二、使用 SQL 创建日期维度表2.1 表结构设计2.2 数据插入2.3 SQL 创建方式的优势与局限 三、使用 Python 创建日期维度表3.1 依赖库引入3.2 代码实现3.3 Python 创建方式的优势与局限 四、应用场景与选择建议4.1 应用场景4.2 选择建…...