在windows环境下安装支持CUDA的opencv-python

news2024/12/25 11:23:51

文章目录

  • 附件:GPU和CUDA的关系 —— 开发人员通过CUDA可以使用GPU的计算能力来加速各种计算任务,并提高计算性能和效率。
  • 一、环境配置
    • (0)我的电脑配置环境
    • (1)CUDA + cuDNN下载与安装
    • (2)OpenCV源码下载与环境配置
    • (3)ImportError: DLL load failed while importing cv2: 找不到指定的模块。
    • (4)解决方法:添加DLL路径
  • 二、测试样本:上传图像到GPU + 从GPU下载图像
  • 三、python使用GPU读取视频

附件:GPU和CUDA的关系 —— 开发人员通过CUDA可以使用GPU的计算能力来加速各种计算任务,并提高计算性能和效率。

GPU(图形处理器,Graphics Processing Unit)
是一种专门设计用于图形渲染和并行计算的硬件设备。传统上,GPU 主要用于图形渲染,即将 3D 数据转换为 2D 图像,以显示在计算机屏幕上。然而,由于 GPU 在并行计算方面的强大能力,逐渐引起了开发者的关注,并开始将 GPU 应用于通用目的的并行计算。现代 GPU 具有大量的处理单元(称为 CUDA Core 或 Shader Core),可以同时执行多个并行计算任务,从而在适合并行计算的任务上提供巨大的计算能力。

CUDA(计算统一设备架构,Compute Unified Device Architecture)
是由 NVIDIA 开发的一种用于通用计算的并行计算平台,它提供了一组编程接口和工具,通过 CUDA,开发者可以使用编程语言(如 CUDA C/C++、CUDA Python)编写 GPU 内核函数(称为 CUDA Kernel),并使用 NVIDIA 的 GPU(图形处理器)执行这些内核函数,以加速各种计算任务,包括图形渲染、科学计算、机器学习等。

两者关系:CUDA是一种用于编写并行计算任务的平台和编程模型,而GPU是实际用于执行计算任务的硬件设备。开发人员通过CUDA可以使用GPU的计算能力来加速各种计算任务,并提高计算性能和效率。

一、环境配置

(0)我的电脑配置环境

windows 10
RTX 3090
cuda 11.8.0
python 3.9.16
opencv 4.6.0
# 注意,安装GPU版的openvc之前需要删除原本的opencv 
# 备注:OpenCV官网下载的源码只支持python3.9

(1)CUDA + cuDNN下载与安装

请看博主的这篇文章:https://blog.csdn.net/shinuone/article/details/129054444

(2)OpenCV源码下载与环境配置

OpenCV下载链接Build OpenCV (including Python) with CUDA on Windows,打开后选择找到OpenCV C++ CUDA builds跳转到下载页面,或者直接跳转下载页面OpenCV C++ CUDA builds。

图解教程请看这篇文章
【步骤一】 选择与自己的电脑环境相支持的版本,OpenCV官网下载的源码只支持python3.9。
在这里插入图片描述
【步骤二】 点击opencv_contrib_cuda_4.6.0.20221106_win_amd64.7z,下载并解压缩,得到两个文件夹:install + lib
【步骤三】 添加系统环境变量:电脑 + 属性 + 高级系统设置 + 环境变量 + 系统变量 + Path + 新建 + D:\AI\opencv_contrib_cuda_4.6.0.20221106_win_amd64\install\x64\vc17\bin
【步骤四】 提取源码中的python3\cv2.cp39-win_amd64.pyd并保存到自己的环境中。注意:cp39表示只支持python3.9版本。
(1)复制文件‪D:\AI\opencv_contrib_cuda_4.6.0.20221106_win_amd64\lib\python3\cv2.cp39-win_amd64.pyd
(2)将其保存到Python环境或Anaconda虚拟环境的site-packages中D:\Anaconda\envs\py39\Lib\site-packages\cv2.cp39-win_amd64.pyd
【步骤四】

(3)ImportError: DLL load failed while importing cv2: 找不到指定的模块。

  • 方式一:在cmd中测试是否安装成功

python -c "import cv2; print(f'OpenCV: {cv2.__version__} for python installed and working')"
在这里插入图片描述

  • 方式二:在Pycharm中测试是否安装成功

import cv2
print(f'OpenCV: {cv2.__version__} for python installed and working')
【BUG】将上述代码复制到Pycharm中,系统显示No module named 'cv2'
在这里插入图片描述
且运行结果如下:
在这里插入图片描述

(4)解决方法:添加DLL路径

添加三行代码(需要根据自己的安装环境修改地址)

import os
# 备注:CUDA的安装路径
# 备注:opencv_contrib_cuda的安装路径
# os.add_dll_directory('C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v12.0\\bin')

os.add_dll_directory(r'D:\CUDA\CUDA02\bin')				
os.add_dll_directory(r'D:\AI\opencv_contrib_cuda_4.6.0.20221106_win_amd64\install\x64\vc17\bin')

import cv2
print(f'OpenCV: {cv2.__version__} for python installed and working')

在源码中系统仍会显示No module named 'cv2' ,但是可以运行成功且不影响后续使用。
在这里插入图片描述
运行结果如下:
在这里插入图片描述

二、测试样本:上传图像到GPU + 从GPU下载图像

在这里插入图片描述

import os
os.add_dll_directory(r'D:\CUDA\CUDA02\bin')
os.add_dll_directory(r'D:\AI\opencv_contrib_cuda_4.6.0.20221106_win_amd64\install\x64\vc17\bin')

import cv2
print(f'OpenCV: {cv2.__version__} for python installed and working')

# (1)读取图像
image = cv2.imread('your_template.png')
if image is None:
    print("无法加载图像1")

# (2)GPU设置
# print(cv2.cuda.getCudaEnabledDeviceCount())     # 检查是否有可用的 GPU
cv2.cuda.setDevice(0)                           # 设置使用的 GPU 设备索引,0 表示第一个 GPU
# cv2.cuda.printCudaDeviceInfo(0)                 # 打印 GPU 设备信息

# (3)上传与下载
image_gpu = cv2.cuda_GpuMat()                                       # 3.0创建一个空的GPU矩阵
image_gpu.upload(image)                                             # 3.1将图像上传到GPU
screenshot = cv2.cuda.cvtColor(image_gpu, cv2.COLOR_RGB2BGR)        # 3.2图像处理
screenshot = cv2.cuda.resize(screenshot, (400, 400))
result_cpu = screenshot.download()                                  # 3.3从GPU下载处理后的图像到CPU

# (4)打印上传与下载前后的图像属性不改变
print("图像宽度: ", image.shape)
print("数据类型:", image.dtype)
print("在CPU下,原始图像格式:", type(image))

print()
print("在GPU下,处理后的图像格式:", type(screenshot))
print()

print("在CPU下,处理后的图像格式:", type(result_cpu))
print("图像宽度: ", result_cpu.shape)
print("数据类型:", result_cpu.dtype)

# (5)显示图像
if result_cpu is None:
    print("无法加载图像2")
else:
    cv2.imshow("Window", result_cpu)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

三、python使用GPU读取视频

(1)opencv - python使用CUDA处理图像

(2)opencv - python使用CUDA读取视频

(3)opencv - C++使用CUDA的入门教程

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

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

相关文章

【云原生、Kubernetes】Kubernetes核心概念理解

首先我们要掌握 Kubernete 的一些核心概念。 这些核心可以帮助我们更好的理解 Kubernetes 的特性和工作机制。 集群组件 首先,Kubernetes 集群中包含2类节点,分别是:master控制节点和node工作节点。 master 控制节点 负责管理整个集群系统…

【手撕算法|动态规划系列No.4】leetcode91. 解码方法

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…

软件测试:系统测试

1 系统测试的概念 系统测试(System Testing)的定义:将已经集成好的软件系统,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其他系统元素结合在一起,在实际运行&#…

HDLBits刷题笔记8:Circuits.Sequential Logic.Latches and Flip-Flops

D flip-flop module top_module (input clk,input d,output reg q );always (posedge clk)q < d; endmoduleD flip-flops 建立一个8bit的D触发器 module top_module (input clk,input [7:0] d,output reg [7:0] q );always (posedge clk)q < d; endmoduleDFF with res…

GDAL 图像直方图统计

文章目录 一、简介二、实现代码三、实现效果参考资料 一、简介 这里使用一种简单的方式来计算图像中的像素值直方图分布。计算过程如下所述&#xff1a; 第一种方式&#xff1a; 1、首先将图像变为一维数组&#xff08;reshape&#xff09;&#xff0c;并将数组中的数值进行排序…

vue点击盒子一步一步滚动

vue点击盒子一步一步滚动 HTML <div class"course_detail"><div class"arrow" v-if"index 0" click"step"></div><div class"lightArrow" v-else click"step"></div><div clas…

自定义的车牌号键盘组件

<template><view class"keyboard-wrap" v-if"kbShow"><view class"head"><view class"done" tap"done"><text class"iconfont iconxiala-"></text>关闭</view></vi…

2. 注册platform

这里先分析platform 对应的dts内容如下 i2s0_8ch: i2sff800000 {compatible "rockchip,rv1126-i2s-tdm";reg <0xff800000 0x1000>;interrupts <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;clocks <&cru MCLK_I2S0_TX>, <&cru MCLK_I2S0_RX&g…

JAVA开发( 腾讯云消息队列 RocketMQ使用总结 )

一、问题背景 之所以需要不停的总结是因为在java开发过程中使用到中间件实在太多了&#xff0c;久久不用就会慢慢变得生疏&#xff0c;有时候一个中间很久没使用&#xff0c;可能经过了很多版本的迭代&#xff0c;使用起来又有区别。所以还是得不断总结更新。最近博主就是在使用…

睿铂相机同步性控制技术解析

极客睿铂 前几期睿铂给大家分享了一些倾斜相机背后的技术&#xff0c;主要都是的关于镜头光学方面的。但实际上倾斜摄影相机还有很多其他关键性技术有待突破&#xff0c;任何技术的发展都不能一蹴而就&#xff0c;需要根据客户的问题反馈&#xff0c;发现新的问题并解决问题&a…

自定义MVC架构【下】

目录 一、前言 二、导出自定义MVC架包 三、使用自定义MVC架包 四、优化增删改查Dao层及Servlet 1.优化增删改查Dao层 2.优化增删改查Servlet代码 五、案例实操 1.将PageTag自定义标签进行配置 2.jsp页面环境搭建 3.案例演示 一、前言 在上篇中&#xff0c;我们已经优化…

ARM架构(寄存器点灯)

文章目录 前言一、LED原理图二、使用寄存器点灯的步骤三、如何操作寄存器四、实际操作1.使能GPIO端口2.将引脚设置为输出模式3.设置输出状态 五、全部代码总结 前言 本篇文章我们来讲解一下如何使用寄存器点亮一个LED灯&#xff0c;一般对于新人来说都是使用HAL库或者标准库来…

SpringBoot3【④ 基础特性】

1. SpringApplication 1.1. 自定义 banner 类路径添加banner.txt或设置spring.banner.location就可以定制 banner推荐网站&#xff1a;Spring Boot banner 在线生成工具&#xff0c;制作下载英文 banner.txt&#xff0c;修改替换 banner.txt 文字实现自定义&#xff0c;个性化…

操作系统面试知识点

1、进程、线程和协程的区别和联系 1、进程是资源调度的基本单位&#xff0c;运行一个可执行程序会创建一个或多个进程&#xff0c;进程就是运行起来的可执行程序 2、线程是程序执行的基本单位&#xff0c;是轻量级的进程。每个进程中都有唯一的主线程&#xff0c;且只能有一个…

机器学习第三课(sklearn接口)

一、sklearn基本知识 中文官网 英文官网 注意&#xff1a;sklearn第三方模块的安装 要用pip install scikit-learn from sklearn.neighbors import KNeighborsClassifier # 1 准备数据 # 训练集的特征数据 2维 x [[-2],[-1],[2],[3],[4]] # 训练集的目标数据 1维 y [0,0,1,…

HTML培训心得体会五篇(合集)

HTML5培训心得一 关于html5培训心得总结? 一&#xff1a;了解HTML5前端开发技术? ?? HTML?指的是超文本标记语言?(Hyper?Text?Markup?Language)&#xff0c;标记语言是一套标记标签?(markup?tag)&#xff0c;HTML?使用标记标签来描述网页。HTML5区别于HTML的标…

北京大学2015计算机学科夏令营上机考试(未完)

A:整数的个数 #include<iostream> using namespace std; int main(){int k,a;cin>>k;int sum10,sum20,sum30;for(int i0;i<k;i){cin>>a;if(a1) sum1;if(a5) sum2;if(a10) sum3;}cout<<sum1<<endl<<sum2<<endl<<sum3;retur…

quiche编译

netty http3使用了rust语言的quiche&#xff0c;quiche使用了c语言的boringssl&#xff0c; 网上没有找到编译好的quiche&#xff0c;只能自己搭建rust环境编译 1、rust安装 见官网https://www.rust-lang.org/tools/install 我是用的是windows的ubuntu&#xff0c;所以直接使…

苹果市值再度突破3万亿美元

KlipC报道&#xff1a;当地时间周五&#xff0c;苹果市值再度突破3万亿美元&#xff0c;这是近43年来&#xff0c;苹果第二次市值达到3万亿。 KlipC的合伙人Andi Duan表示&#xff1a;“得益于苹果股价上涨&#xff0c;以及硅谷银行引发的金融市场动荡&#xff0c;再加上高端IP…

【嵌入式Qt开发入门】如何创建并连接信号与槽

创建信号 我们先新建一个项目&#xff0c;命名为 signal_slot_example&#xff0c;如果还不会新建项目&#xff0c;请回到 【嵌入式Qt开发入门】初识信号与槽查看项目如何建立的。取消勾选*ui 文件&#xff0c;其他步骤不变。 由于信号只需声明&#xff0c;无需定义。所以我们只…