2024-06-06 Python OpenCV 使用GPU环境

背景

Python中使用OpenCV处理图像,一般需要Python环境,在Python中安装OpenCV环境就可以使用。此环境中做图像处理是使用电脑CPU。

想要使用GPU处理图像需要对Python环境进行配置。

GPU

使用GPU需要电脑具备GPU功能,一般英伟达显卡都有。而且不同的GPU需要使用不同的OpenCV版本。笔者这里使用了2台电脑,显卡不同使用的OpenCV和Python版本都不同。具体的版本对应关系笔者也不是很清楚,针对2个不同的显卡CUDA环境进行描述。

首先确保你电脑上的显卡驱动正确安装,安装驱动后如果没有安装对应的CUDA环境请自行安装显卡对应的CUDA:

CUDA Toolkit Archive | NVIDIA Developer

有地方说还需要cuDNN环境,但是笔者没有cuDNN环境也可以,估计实际上不需要。

CUDA 11.4

2024-06-06_131322.jpg
2024-06-06_131229.jpg
2024-06-06_131614.jpg

此电脑显卡GeForce GT 710,显卡驱动已安装CUDA是11.4。此环境确保CUDA是可用的,然后就是OpenCV,有很多地方说Python中使用pip install安装的opencv-python是不带CUDA的,需要自己编译带CUDA的OpenCV,需要自己编译带CUDA的OpenCV。这个笔者确实不太懂,不过正常使用Python用pip install安装环境确实很便捷,如果这样安装的不带,那就比较麻烦了。笔者之前编译过C++下的OpenCV,那时候没有想过CUDA的事,当时也没在意有没有带CUDA环境,那个过程比较麻烦,所以这里也没想再编译,所以找到一个大佬,自己编译了好多版本的OpenCV是带CUDA可用的,可以在下面链接去下载。

Releases · cudawarped/opencv_contrib (github.com)

这里的OpenCV版本没有实际OpenCV的版本多,差异的话笔者也不是很清楚,不过能正常用。

但是版本还是很关键的,笔者2个电脑一个CUDA11一个CUDA12,11的使用OpenCV4.7的不行,12的使用OpenCV4.5的不行,具体为啥也不知道。

2024-06-06_133056.jpg

笔者现在手里有2个版本的OpenCV,4.7是在上述网站中下载的,4.5是在博客中某大佬的分享下载的,因为那个网站此时没有4.5版本的,只能自己找资源。

2024-06-06_133420.jpg

将opencv_4_5_0_cuda_11_1_py38.7z文件解压到电脑中,有的地方说要配置环境变量,其实不用,在使用的时候总是要添加进去的。

2024-06-06_133647.jpg

进刚刚解压路径的这里,有个cv2.cp38-win_amd64.pyd文件,注意看这个文件名称中,cv2.cp38这个很关键,这个表示对应的Python版本,笔者刚开始不知道一直用的Python3.9,最后使用OpenCV4.7里面这个文件命名是cv2.cp39,才联想起来。所以这里要说的是,你使用的Python版本是这个OpenCV版本决定的。一定要根据OpenCv版本再安装Python,好在Python很容易安装,再把环境变量改一下就行了,也不用卸载老版本之类的。

2024-06-06_134019.jpg

将那个文件拷贝到Python的库路径中。

2024-06-06_134455.jpg

确认一下电脑的Python环境,里面确实没有opencv-python。

2024-06-06_134445.jpg

在代码中使用cv2提示的不是找不到cv2模块,而是 DLL load failed while importing cv2: 找不到指定的模块。

虽然是有错误,但是不是那种错误,也就说明有效。

2024-06-06_134730.jpg

在代码中添加导入CUDA和OpenCV的代码,就可以正常使用cv2了。

import os

os.add_dll_directory("C:\\Program Files\\NVIDIA GPU Computing Toolkit\CUDA\\v11.4\\bin")
os.add_dll_directory("D:\\Program Files\\opencv_4_5_0_cuda_11_1_py38\\install\\x64\\vc16\\bin")

import cv2 as cv

print("OpenCV版本", cv.__version__)

cv.cuda.printCudaDeviceInfo(0)
"D:\Program Files\Python\Python3810\python.exe" D:/workspace/python/test2/src/org/test/test1.py
OpenCV版本 4.5.0
*** CUDA Device Query (Runtime API) version (CUDART static linking) *** 

Device count: 1

Device 0: "NVIDIA GeForce GT 710"
  CUDA Driver Version / Runtime Version          11.40 / 11.10
  CUDA Capability Major/Minor version number:    3.5
  Total amount of global memory:                 2048 MBytes (2147483648 bytes)
  ( 1) Multiprocessors x (192) CUDA Cores/MP:     192 CUDA Cores
  GPU Clock Speed:                               0.95 GHz
  Max Texture Dimension Size (x,y,z)             1D=(65536), 2D=(65536,65536), 3D=(4096,4096,4096)
  Max Layered Texture Size (dim) x layers        1D=(16384) x 2048, 2D=(16384,16384) x 2048
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 65536
  Warp size:                                     32
  Maximum number of threads per block:           1024
  Maximum sizes of each dimension of a block:    1024 x 1024 x 64
  Maximum sizes of each dimension of a grid:     2147483647 x 65535 x 65535
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and execution:                 Yes with 1 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Concurrent kernel execution:                   Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support enabled:                No
  Device is using TCC driver mode:               No
  Device supports Unified Addressing (UVA):      Yes
  Device PCI Bus ID / PCI location ID:           1 / 0
  Compute Mode:
      Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) 

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version  = 11.40, CUDA Runtime Version = 11.10, NumDevs = 1


Process finished with exit code 0

CUDA 12

在CUDA11.4的电脑中成功使用了CUDA后,对整个过程都熟悉了,就是那几个环境,然后版本对应上,其它电脑也是一样的原理,所以在CUDA12的电脑上一下子就成功了。

与上文的不同是首先电脑显卡不同,那么显卡驱动就不同,所以CUDA不同。具体的CUDA与OpenCV的版本关系笔者也不清楚,基于CUDA11用的OpenCV4.5,还有个地方看到别人也记录一样的事情,环境也一样,对方的CUDA是12,用的OpenCV4.7,所以在CUDA12的电脑上笔者直接下载OpenCV4.7的版本。而在OpenCV4.7中使用的Python是3.9。所以上述环境准备好后很容易就可以搭建好环境。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341

推荐阅读更多精彩内容