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。所以上述环境准备好后很容易就可以搭建好环境。

  • 28
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值