背景
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
此电脑显卡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的不行,具体为啥也不知道。
笔者现在手里有2个版本的OpenCV,4.7是在上述网站中下载的,4.5是在博客中某大佬的分享下载的,因为那个网站此时没有4.5版本的,只能自己找资源。
将opencv_4_5_0_cuda_11_1_py38.7z文件解压到电脑中,有的地方说要配置环境变量,其实不用,在使用的时候总是要添加进去的。
进刚刚解压路径的这里,有个cv2.cp38-win_amd64.pyd文件,注意看这个文件名称中,cv2.cp38这个很关键,这个表示对应的Python版本,笔者刚开始不知道一直用的Python3.9,最后使用OpenCV4.7里面这个文件命名是cv2.cp39,才联想起来。所以这里要说的是,你使用的Python版本是这个OpenCV版本决定的。一定要根据OpenCv版本再安装Python,好在Python很容易安装,再把环境变量改一下就行了,也不用卸载老版本之类的。
将那个文件拷贝到Python的库路径中。
确认一下电脑的Python环境,里面确实没有opencv-python。
在代码中使用cv2提示的不是找不到cv2模块,而是 DLL load failed while importing cv2: 找不到指定的模块。
虽然是有错误,但是不是那种错误,也就说明有效。
在代码中添加导入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。所以上述环境准备好后很容易就可以搭建好环境。