opencv+opencv_contrib+cuda和VS2022编译

本文介绍使用OpenCV和OpenCV_Contrib源码及Cuda进行编译的过程,编译过程中会用到OpenCV、OpenCV_Contrib、Toolkit、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

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

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

相关文章

spring中的@ConfigurationProperties注解详解

一、核心功能与作用 ConfigurationProperties 是Spring Boot中用于将外部配置&#xff08;如application.properties或application.yml中的属性&#xff09;绑定到Java对象的核心注解。其核心功能包括&#xff1a; 配置集中管理&#xff1a;将分散的配置属性按前缀绑定到Java类…

【C/C++】函数模板

&#x1f3af; C 学习笔记&#xff1a;函数模板&#xff08;Function Template&#xff09; 本文是面向 C 初学者的函数模板学习笔记&#xff0c;内容包括基本概念、定义与使用、实例化过程、注意事项等&#xff0c;附带示例代码&#xff0c;便于理解与复现。 &#x1f4cc; 一…

电子病历高质量语料库构建方法与架构项目(智能数据目录篇)

电子病历高质量语料库的构建是医疗人工智能发展的基础性工作,而智能数据目录作为数据治理的核心组件,能够有效管理这些语料资源。本文将系统阐述电子病历高质量语料库的构建方法与架构,特别聚焦于智能数据目录的设计与实现,包括数据目录的功能定位、元数据管理、构建步骤以…

前端懒加载(Lazy Loading)实战指南

&#x1f680; 前端懒加载&#xff08;Lazy Loading&#xff09;实战指南 懒加载是现代 Web 性能优化的“常规操作”。它的目标简单直接&#xff1a;让用户只加载“当下真正需要的资源”。从静态资源、组件、模块到数据&#xff0c;每一层都可以使用懒加载技术&#xff0c;构建…

在 Ubuntu 系统中,查看已安装程序的方法

在 Ubuntu 系统中&#xff0c;查看已安装程序的方法取决于软件的安装方式&#xff08;如通过 apt、snap、flatpak 或手动安装&#xff09;。以下是几种常见方法&#xff1a; 通过 apt 包管理器安装的软件 适用于通过 apt 或 dpkg 安装的 .deb 包。 列出所有已安装的软件包&…

性能优化实践:性能监控体系

性能优化实践&#xff1a;性能监控体系 在Flutter应用开发中&#xff0c;建立一个完善的性能监控体系对于保证应用质量和用户体验至关重要。本文将从实战角度深入讲解如何搭建Flutter应用的性能监控体系&#xff0c;包括监控指标的设计、数据采集实现、分析平台搭建等内容。 …

kotlin 02flow-sharedFlow 完整教程

一 sharedFlow是什么 SharedFlow 是 Kotlin 协程中 Flow 的一种 热流&#xff08;Hot Flow&#xff09;&#xff0c;用于在多个订阅者之间 共享事件或数据流。它适合处理 一次性事件&#xff08;如导航、弹窗、Toast、刷新通知等&#xff09;&#xff0c;而不是持续状态。 ✅ …

模拟开发授权平台

这次只是实现应用的curd和公私钥的校验以及第三方的通知dmeo项目&#xff0c;大家可以拓开视野来编写 进入主题 项目链接&#xff1a;桌角的眼镜/develop_auth_platform 直接下拉并运行就行 回调应用代码在test包中 回调应用测试代码 package mainimport ("encoding/…

STM32 USART串口

一、通信接口 二、串口通信 串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使用、通信线路简单&#xff0c;可实现两个设备的互相通信单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信&#xff0c;极大地扩展了单片机的应用…

uniapp开发06-视频组件video的使用注意事项

uniapp开发-视频组件video的使用注意事项&#xff01;实际项目开发中&#xff0c;经常会遇到视频播放的业务需求。下面简单讲解一下&#xff0c;uniapp官方提供的视频播放组件video的常见参数和实际效果。 1&#xff1a;先看代码&#xff1a; <!--视频组件的使用展示-->…

【爬虫】微博热搜机

第一个下面一点&#xff1a; js代码&#xff1a; const n require("crypto-js");let s n.SHA1(n.enc.Utf8.parse("tSdGtmwh49BcR1irt18mxG41dGsBuGKS")) , a n.enc.Hex.parse(s.toString(n.enc.Hex).substr(0, 32));function h(t) {let e (i t Stri…

软考 系统架构设计师系列知识点之杂项集萃(51)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;50&#xff09; 第80题 设三个煤场A1、A2、A3分别能供应煤7、12、11万吨&#xff0c;三个工厂B1、B2、B3分别需要10、10、10万吨&#xff0c;从各煤场到各工厂运煤的单价&#xff08;百元/吨&…

npm,yarn,pnpm,cnpm,nvm,npx包管理器常用命令

前端比较主流的包管理器主要有三个npm&#xff0c;yarn&#xff0c;pnpm 多层级依赖&#xff0c;通常发生在依赖之间存在复杂的版本要求时 包 A 依赖于包 B1.0.0 包 B 依赖于包 C2.0.0 另一个包 D 也依赖于 C3.0.0 一、NPM (Node Package Manager) https://www.npmjs.cn/…

科普简洁版:同态加密——密码学的未来瑰宝

文章目录 一、同态加密的基本概念1.1 什么是同态加密1.2 同态加密的数学本质1.3 同态加密的类型 二、主要同态加密方案详解2.1 ElGamal加密2.2 Paillier加密2.3 Gentry的完全同态加密方案2.4 BGV方案2.5 BFV方案2.6 CKKS方案 三、同态加密的关键技术3.1 噪声管理技术3.2 多项式…

力扣第448场周赛

赛时成绩如下: 这应该是我力扣周赛的最好成绩了(虽然还是三题) 1. 两个数字的最大乘积 给定一个正整数 n。 返回 任意两位数字 相乘所得的 最大 乘积。 注意&#xff1a;如果某个数字在 n 中出现多次&#xff0c;你可以多次使用该数字。 示例 1&#xff1a; 输入&#xff1…

(一)Modular Monolith Architecture(项目结构/.net项目初始化/垂直切片架构)

文章目录 项目地址一、项目结构1.1 Modules1. Events 模块2. Users 模块3. Ticketing 模块4. Attendance 模块1.2 数据库模块1.3 模块架构选择1. 全是Clean Architecture2. 分别使用不同的架构二、初始化项目2.1 本地创建项目结构1. 创建空的solution2. 添加基础配置3. 创建git…

Java常用组件之Redis经典面试题(一)

大家好&#xff0c;今天为大家带来Java项目中&#xff0c;几乎必不可少的组件之一-Redis的一些常见面试题&#xff0c;帮忙近期需要面试的朋友们来一个理论基础突击&#xff01; 一、数据类型 1.Redis的常用数据类型有哪些 ? 难易程度&#xff1a;☆☆☆ 出现频率&#xff1a;…

2025.5.4总结

今天去光谷步行街逛了一下&#xff0c;感觉熟悉又陌生&#xff0c;说熟悉是因为初二的时候来过武汉光谷&#xff0c;尽管过去了8年时间&#xff0c;但丝毫不影响标志性建筑的存在&#xff0c;也陌生是商场的建筑风格真实气派&#xff0c;感觉进入了一座城堡&#xff0c;在里面都…

神经网络在专家系统中的应用:从符号逻辑到连接主义的融合创新

自人工智能作为一个学科面世以来&#xff0c;关于它的研究途径就存在两种不同的观点。一种观点主张对人脑的结构及机理开展研究&#xff0c;并通过大规模集成简单信息处理单元来模拟人脑对信息的处理&#xff0c;神经网络是这一观点的代表。关于这方面的研究一般被称为连接机制…

Doo全自动手机壳定制系统

Doo全自动手机壳定制系统 项目概述 Doo全自动手机壳定制系统是一个完整的手机壳定制解决方案&#xff0c;支持多端应用&#xff0c;包括服务端、客户端、管理后台等多个组件。系统采用现代化的技术栈&#xff0c;提供完整的手机壳定制、订单管理、用户管理等功能。 目录结构…