Win11下配置OpenCV with CUDA

news2024/9/23 3:23:38

前些天在B站上看到用OpenCV调用CUDA加速目标检测和关键点检测的教程,较Pytorch推理速度提升很明显,最近整了个RTX4070,所以就也想来试一试。由于刚换了电脑,没有相关环境,配置过程中踩了一些坑,因此有了这篇记录文章。

目录

  • 基本配置
  • 前置条件
  • 下载和修改OpenCV
      • 下载
      • 修改配置
  • 编译OpenCV
      • 1.利用CMake配置OpenCV源代码工程
      • 2.Visual Studio 2019 编译OpenCV源代码
  • 配置 Visual Studio 2019
      • 测试程序
    • 参考教程

基本配置

  1. 系统:Windows11-22H2
  2. 显卡:RTX4070
  3. 驱动:CUDA-11.8,cudnn-windows-x86_64-8.9.2.26
  4. 编译软件:CMake, Visual Studio 2019
  5. 版本:OpenCV 4.7.0,Contrib 4.7.0

前置条件

安装Visual Studio2019,CMake,CUDA以及cuDNN

  1. Visual Studio下载地址
  2. CMake下载链接
  3. CUDA下载链接
  4. cuDNN下载链接
    VS和CMake安装很简单,就跟普通的软件一样,CUDA和cuDNN的下载和安装可以参考之前的这篇文章

下载和修改OpenCV

下载

地址

  1. OpenCV
  2. contrib包

需要注意,下载的OpenCV主包和Contrib包的版本要一致才可以,我用的是4.7.0版本

下载好后,将这两个包解压至同一目录下,方便查找。同时,为了存放编译生成的支持CUDA的OpenCV库,需要创建一个新的文件夹,这里我在同一目录下创建了一个名为opencv_cuda_build的文件夹,具体如图1所示

图1-目录
由于下载下来的OpenCV编译好的包没有CUDA以及contrib包中的相关支持,所以需要源代码编译,生成支持Contrib和CUDA的定制的OpenCV库。从下载的OpenCV源代码到我们加速推理所需要的库文件之间需要经过以下步骤:

  1. 使用CMake配置OpenCV源代码的工程,生成VS编译所需的工程文件
  2. 利用VS将源代码编译成相应的库文件
  3. 将编译生成的OpenCV库文件配置到VS中,方可在VS工程中链接到我们自己编译的库

修改配置

由于某些客观原因,编译OpenCV以及contrib所需的某些库在国内无法下载,因此需要对下载下来的代码配置进行一些修改方可避免缺少某些库导致编译失败。

具体来说,主要是OpenCV的ffmpeg,ippicv和contrib的face,xfeatures2d这几个库。

解决方法就是,修改这几个库的下载地址,在原来的下载地址前增加代理。
例如,在ippicv的ippicv.cmake文件中的原始下载地址

https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/

前面新增一个代理地址

https://ghproxy.com/

修改成这样即可

https://ghproxy.com/https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/

如图2所示
图2-修改ippicv下载地址
以此类推,ffmpeg的配置文件是opencv\sources\3rdparty\ffmpeg\ffmpeg.cmake,xfeatures2d配置文件是opencv_contrib-4.7.0\opencv_contrib-4.7.0\modules\xfeatures2d\cmake**目录下的download_boostdesc.cmakedownload_vgg.cmake**,face的配置文件是F:\packages\opencv_contrib-4.7.0\opencv_contrib-4.7.0\modules\face\CMakeLists

编译OpenCV

前期工作准备完毕,开始编译我们所需的OpenCV。

1.利用CMake配置OpenCV源代码工程

  • 打开CMake软件,Where is the source code这一栏选择我们解压的OpenCV的源代码的路径,我这里是F:/packages/opencv/sources。Where to build the binaries这一栏选择我们创建的opencv_cuda_build文件夹。然后点击Configure进行第一次Configure,在弹出的对话框中选择VS 2019和x64,之后点击finish。
    图3-配置CMake
    执行完成后界面如下图所示:
    图4-第一次Configure完成

  • 接下来在CMake搜索框搜索CUDA,勾选弹出的CUDA选项
    图5-CUDA

  • 搜索并勾选math相关
    图6-添加math支持

  • 搜索并勾选NONFREE
    图7-NONFREE

  • 搜索并勾选BUILD_opencv_world
    图8-BUILD_opencv_world

  • 搜索GENERATE_SETUPVARS,取消勾选
    图9-取消GENERATE_SETUPVARS

  • 最后搜索MODULES并添加contrib包的路径
    图10-添加contrib包路径
    至此,完成这一步的配置选择,第二次点击configure,等待配置完成,如下图:
    图11-第二次configure完成

  • configure完成后,搜索CUDA_ARCH_BIN,根据自己的GPU算力选择保留对应的数值。具体GPU对应的数值可以从Nvidia官网查找。由于40系显卡的计算能力是8.9,而4.7版本的OpenCV支持的最大的计算能力是8.6,所以我这里选择的是8.6

图12-GPU算力
接下来第三次点击configure,等待完成后点击generate如下图所示:
图13-configure完成并generate成功
然后就可以点击Open Project打开Visual Studio 2019,至此,CMake完成使命

2.Visual Studio 2019 编译OpenCV源代码

  • 打开VS工程后,选择Release x64版本,并在解决方案管理器中的CMakeTargets目录下右键点击ALL_BUILD,选择生成,开始编译。(这一过程需要挺久的,13600K编译大概50分钟左右)

图14-编译ALL_BUILD

  • ALL_BUILD编译完成之后,再选择INSTALL,同样右键执行生成操作
    图14-生成INSTALL
    这一步执行完成之后,会在opencv_cuda_build/文件夹下生成install文件夹:
    图15-生成的install文件夹
    生成的install文件夹下的文件就是我们需要的文件,至此,OpenCV编译完成!

配置 Visual Studio 2019

编译完OpenCV后,需要对VS进行一些配置才能在我们的项目中引用到我们编译的OpenCV库。具体来说主要有

  1. 添加包含目录
  2. 添加库目录
  3. 添加附加依赖项
  4. 添加环境变量
  • 首先,我们创建一个空白的VS C++工程并添加源文件main.cpp,然后选择Release x64,在右边的属性管理器的Release | x64处右键->属性,在弹出来的属性页面的VC++目录选项的包含目录下添加这两个include路径:
F:\packages\opencv_cuda_build\install\include
F:\packages\opencv_cuda_build\install\include\opencv2

图16-添加包含目录
图17-添加包含目录

  • 然后在下面的库目录中添加lib路径:
F:\packages\opencv_cuda_build\install\x64\vc16\lib

图18-添加库目录

  • 最后在链接器->输入->附加依赖项选项中添加opencv_cuda_build\install\x64\vc16\lib文件夹下的所有lib文件名,我这里只有opencv_img_hash470.lib和opencv_world470.lib这两个。
    图19-添加附加依赖项
  • 最后需要将编译的二进制文件路径添加到环境变量中,在系统搜索栏中搜索编辑环境变量,在Path这一栏中添加bin路径:
F:\packages\opencv_cuda_build\install\x64\vc16\bin

在这里插入图片描述

至此,VS配置完成,可以在VS中调用我们刚刚编译的支持CUDA的OpenCV了。

测试程序

在刚刚创建的main.cpp中添加如下示例程序:

#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/cudaarithm.hpp>
#include <iostream>

using namespace std;
using namespace cv;
using namespace cv::cuda;

int main()
{
    // OpenCV版本号
    cout << "OpenCV_Version: " << CV_VERSION << endl;
    // CUDA
    int num_devices = getCudaEnabledDeviceCount();
    if (num_devices)
        cout << "CUDA is available, num_devices:" << num_devices << endl;
    else
        cout << "CUDA is not available." << endl;
    //读取图片
    Mat img = imread("D:/CUDA_ARCH_BIN.png");

    imshow("picture", img);
    waitKey(0);
    return 0;
}

如果能正确显示图片以及CUDA,表明安装成功!
图20-测试结果

参考教程

  1. 解决ippicv等下载问题
  2. OpenCV安装教程
  3. 之前的安装文章

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

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

相关文章

立创EDA:(1)AB32VG1开发板画PCB笔记

文章目录 1.准备原理图1.1 原理图参考资料1.2 我的原理图1.2.1 引脚分配1.2.2 电源电路1.2.3Type-c口和USB转串口CH340N1.2.4 三色灯&#xff0c;红外接收器&#xff0c;蓝牙天线1.2.5 ADC按键电路1.2.6 SD卡电路1.2.7 耳塞&#xff0c;麦克风&#xff0c;FM天线1.2.8 功放电路…

期末速成之插入排序(一)

文章目录 1.&#x1f349;排序1.1&#x1f348;插入排序1.1.1 &#x1f34c;插入排序 &#x1f34c;1.1.2 希尔排序 1.&#x1f349;排序 &#xff08;本质&#xff1a;进行一个筛选&#xff09; 排序在生活中的应用&#xff1a; 1.1&#x1f348;插入排序 1.1.1 &#x1f3…

AN13189-移植

AN13189.pdf 2简介 本文件提供了从软件角度将基于PN7160 NXP NCI的NFC控制器集成到Android平台的指南。 它首先解释了如何安装所需的内核驱动程序&#xff0c;然后逐步描述了如何调整Android开源项目源代码以添加PN7160 NFC控制器的支持。图1显示了整个Android NFC堆栈的架构。…

【程序】基于simulink车辆动力学可视化仿真

一、前言 车辆动力学是研究汽车在行驶过程中的运动学和力学特性的学科。它研究车辆在不同路面条件、不同驾驶情况下的加速、制动、转向等运动状态&#xff0c;并通过建立数学模型来分析和优化车辆的性能和安全性。车辆动力学是汽车工程、机械工程和物理学等学科的交叉领域&…

基于SpringBoot的SSM整合案例 -- SpringBoot快速入门保姆级教程(四)

文章目录 前言1.设计创建数据库表tbl_book2.创建新的SpringBoot模块&#xff0c;勾选相关依赖3. 添加SpringBoot创建项目时没有提供的相关坐标4.根据数据库表创建实体类Book5.编写dao层操作BookDao6.编写Service服务层接口BookService7.编写服务层实现类BookServiceImpl8.编写B…

AI催生电影新纪元?大咖们纷纷发声|瞩目上影节

AI催生电影新纪元&#xff1f;大咖们纷纷发声&#xff5c;瞩目上影节 听说“谁懂AI&#xff0c;谁股票就飙高”。博纳影业集团创始人兼总经理于冬一句话引得会场爆笑连连。 AI成为今年上海国际电影节热议话题之一。在金爵电影论坛开幕论坛上&#xff0c;于冬、中国电影股份有限…

keyclock==纯java实现第三方登录

官网Guides - Keycloak 下载 Downloads 18.0.0 - Keycloak GitHub: https://github.com/keycloak/keycloak/tags?after17.0.1 1-安装启动 参照readme文件 启动 bin\kc.bat start-dev 初始化超管账号密码admin admin 参考官方教程 OpenJDK - Keycloak 打开超管界面h…

Mac 上的搜狗输入法卡顿问题

我的 Mac 使用的中文输入法是搜狗拼音输入法&#xff0c;一直有一个问题&#xff0c;就是 Mac 开机太久&#xff0c;输入法会出现卡顿问题&#xff0c;按下按键 0.5s 后需才会显示对应的汉字&#xff0c;用着非常难受&#xff0c;以前这种情况我都是通过重启 Mac 来解决&#x…

Python算法练习6.18

leetcode 1431 拥有最多糖果的孩子 给你一个数组 candies 和一个整数 extraCandies &#xff0c;其中 candies[i] 代表第 i 个孩子拥有的糖果数目。 对每一个孩子&#xff0c;检查是否存在一种方案&#xff0c;将额外的 extraCandies 个糖果分配给孩子们之后&#xff0c;此孩…

全国大数据与计算智能挑战赛:面向低资源的命名实体识别基线方案,排名13/64,组织单位:国防科技大学系统工程学院(大数据与决策实验室)

NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型压缩算法等 专栏详细介绍:NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型…

管理类联考——英语二——技巧篇——写作——B节——图表作文——必备词汇句型

图表作文必备词汇句型 1&#xff0e;该表格展示了…… The table reveals The table demonstrates The table shows The table depicts The tableillustrates The table presents The table describes 2&#xff0e;占…… Comprise Take up Account for Constitute C…

【MySQL】不就是索引

前言 嗨&#xff01;小伙伴们周末快乐呀&#xff01;想必你们周末都在家里边呆着吧&#xff0c;外面实在是太热了&#xff01;在家里吹着空调做着自己喜欢做的事情吧&#xff01;本期我们主要学习的是MySQL中的约束条件。 目录 前言 索引概述 外键约束 1.概念 2.语法 1.添加…

机器学习的学习准则(期望风险最小化、经验风险最小化、结构风险最小化)

训练集是有N个独立同分布的样本组成&#xff0c;即每个样本(x,y)是独立的从相同的分布中抽取的。这个真实的分布未知 输入空间X和输出空间Y构成样本空间&#xff0c;对于样本空间中的样本(x, y)∈X x Y&#xff0c;假定x和y之间可通过一个未知的真实隐射yg(x)来描述&#xff0…

九、提交代码自动触发Jenkins构建版本

提交代码自动触发Jenkins构建版本 1. 下载Generic Webhook Trigger 2. 配置Generic Webhook Trigger http://JENKINS_URL/generic-webhook-trigger/invoke?tokenruoyi-ui-8978456465 http://192.168.1.183:8080 为jenkisn地址&#xff0c;/generic-webhook-trigger/invoke?…

学习潘海东博士的《潮汐调和分析原理和应用》

潘海东博士在B站&#xff08;用户名&#xff1a;ocean_tide&#xff09;分享了他的电子书《潮汐调和分析原理和应用》&#xff0c;以及他开发的潮汐调和分析工具包S_Tide&#xff0c;非常厉害。 在学习《潮汐调和分析原理和应用》之前&#xff0c;我们需要安装matlab软件。 1 、…

阿里云免费服务器申请流程、领取入口、主机配置及限制条件

阿里云服务器免费试用申请链接入口 aliyunfuwuqi.com/go/free 阿里云个人用户和企业用户均可申请免费试用&#xff0c;最高可以免费使用3个小时&#xff0c;阿里云服务器网分享阿里云服务器免费试用申请入口链接及云服务器配置&#xff1a; 目录 阿里云服务器免费试用 企业…

高通 Android 12 调试产测NFC功能

1、在dev/nxpnfc节点添加对应的文件权限 on property:sys.boot_completed1# nfc add by zmchmod 777 /dev/nxpnfc 2、在vendor/nxp/nfcdevice-nfc.mk文件中 修改NFC添加到编译路径如下所示,跟平时内置apk方式有点类似 PRODUCT_PACKAGES NFCTestApp-include \vendor\nxp\nfc\…

powerdesigner简单使用

批量修改表名schema vb里面好像没有!的功能&#xff1f;我之前疯狂报错&#xff0c;直到把"!“改成了”<>"; table中的字段名&#xff0c;似乎用下面的界面就可以调用&#xff1b; 推荐找一些vbs的语法记录看一下 批量加入前缀后&#xff0c;所有的表名竟然…

微服务开发系列 第十二篇:MongoDB

总概 A、技术栈 开发语言:Java 1.8数据库:MySQL、Redis、MongoDB、Elasticsearch微服务框架:Spring Cloud Alibaba微服务网关:Spring Cloud Gateway服务注册和配置中心:Nacos分布式事务:Seata链路追踪框架:Sleuth服务降级与熔断:SentinelORM框架:MyBatis-Plus分布式任…

英语时态的变化

思考&#xff1a;汉语和英语是靠什么来说明时态的 汉语和英语关于时态的区别 汉语英语1.人们采取行动。&#xff08;一般状态&#xff09;People take actions.&#xff08;动词&#xff0c;注意动词的变化&#xff09;2.人们正在采取行动。&#xff08;正在进行&#xff09;P…