【opencv】windows10下opencv4.8.0-cuda Python版本源码编译教程
提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论
文章目录
- 【opencv】windows10下opencv4.8.0-cuda Python版本源码编译教程
- 前言
- 准备工具
- anaconda/cuda/cudnn
- anaconda创建环境(选做)
- 安装原生python(选做)
- cmake
- opencv4.8.0
- opencv_contrib
- CMake编译
- VS2019编译
- 可能出现的问题
- cmake编译过程中可能出现的问题
- VS2019编译过程中可能出现的问题
- 测试使用GPU
- 总结
前言
OpenCV是一个开源的计算机视觉库,包含了核心模块和扩展模块,提供了基础的图像处理和计算机视觉算法,以及一些机器学习工具。而OpenCV Contrib是OpenCV社区贡献的一组扩展模块之一,包含了一些较为新颖和实用的算法和工具函数,提供了一些高级的图像处理和计算机视觉算法。这些功能和算法可能不适合所有用户或者还处于实验性阶段。OpenCV Contrib模块中的代码由社区贡献者开发和维护,它们提供了一些在OpenCV核心库中尚未包含的新特性和实验性功能。
准备工具
cmake、vs2019、opencv4.8.0、opencv_contrib-4.8.0、anaconda、cuda、cudnn
anaconda/cuda/cudnn
安装cuda、cudnn可以参考此前博主的【深度学习windows10环境配置详细教程】,因为对于新手来说,需要注意的细节比较多,这里不浪费篇幅重复讲述了。
anaconda创建环境(选做)
为了将CUDA版本的opencv安装到虚拟环境中,安装到默认环境(base)不需要执行此步骤。
# 搭建opencv环境
conda create -n opencv_onnx_gpu python=3.10.9 -y
# 激活环境
activate opencv_onnx_gpu
虚拟环境中需要安装numpy,后续的编译过程中需要。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy
安装原生python(选做)
在使用 CMake 为 Anaconda 新建的虚拟环境安装 OpenCV 时,需要在主机上安装一个与虚拟环境中的 Python 版本一致的原生环境,这是由于CMake 需要在构建过程中使用与虚拟环境中的 Python 版本一致的 Python 解释器来生成适用于该版本的 Python 绑定。
博主在anaconda创建的虚拟环境python为3.10,因此需要安装了python3.10原生版本,否则即使通过编译但始终无法使用opencv-python。
原生python官网下载地址,选择Windows版本。
这里通过激活虚拟环境查看安装对应的版本,博主不确定这种微小版本的差异会不会影响后续编译测试,所以最好都保持一致。
勾选加入系统环境后直接安装。
配置环境变量,这里可能出现cmd使用的python版本还是使用anaconda的base环境的情况,这是因为在环境变量Path中anaconda的顺序排在原生Python的前面,调整原生python的路径在anaconda的base之前即可。
cmake
CMake官方下载地址,下载cmake-3.27.7-windows-x86_64.msi。
添加到环境和安装路径博主根据自身情况作出了修改,其他都是默认安装。
出现以下界面安装成功。
opencv4.8.0
Opencv官方下载地址,下载OpenCV – 4.8.0 Sources,下载解压opencv-4.8.0.zip。
opencv_contrib
opencv_contrib官方下载地址,选择opencv对应的contrib版本,例如opencv4.8.0对应就是opencv_contrib-4.8.0.zip。下载后直接解压。
CMake编译
- 打开CMake,where is the source code是Opencv sources(博主是opencv-4.8.0)的文件夹位置,where to build the binaries是编译opencv保存的文件夹位置(自定义),在左下角第一次点击Configure。
- 选择对应vs的版本(博主是vs2019),系统选择x64,最后点右下角Finish,显示Configuring done。
- 安装到默认环境(base)不需要执行此步骤,该步骤步骤的目的是安装cuda版本opencv到用户自定义的虚拟环境中,分别将路径指向自定义虚拟环境的对应位置 : PYTHON3_EXECUTABLE、PYTHON3_INCLUDE_DIR、PYTHON3_LIBRARY、PYTHON3_NUMPY_INCLUDE_DIRS(需要安装numpy)、PYTHON3_PACKAGES_PATH。
4.在Search搜索框搜索带cuda的关键字,全部勾选。
- Search搜索框搜索OPENCV_EXTRA_MODULES_PATH,添加解压的opencv_contrib中的modules的路径,再搜索并勾选OPENCV_ENABLE_NONFREE选项。
- 将build_opencv_world选上,这可以将所有opencv的库都编译在一起,不需要自己手动选择添加每个小模块,但是具体的工程又不建议这种全家桶。
- 对于java、js、tests相关选项的选择,用Search搜索框分别搜索“java”,“js”,“tests”,根据需要选中和取消相关选项,默认都是选中,博主都取消了,必须勾选BUILD_opencv_python3,决定了能否在python中使用GPU加速,第二次点击Configure。
- 显示Configuring done后,将CUDA_ARCH_BIN显卡算力内容改成自己显卡的算力。官网查看显卡算力地址,删除小于自己显卡算力的部分,再搜索并勾选ENABLE_FAST_MATH选项,第三次点击Configure。
- 显示Configuring done后,点击generate,显示generating done,成功完成cmake编译,在输出的opencv保存文件夹位置中存在就生成了OpenCV.sln文件。
cmake编译过程是会从githup上下载数据,但是一般都会出现下载失败的情况,这里建议读者先跳到【可能出现的问题】这一小节,来确认是不是自己也出现了下载失败的情况。
VS2019编译
- 确保在解决方案的bindings这个目录下有opencv_python3,否则即使编译成功仍然不能使用CUDA加速。
- 使用VS2019 (以管理员方式运行) 打开刚刚编译工程OpenCV.sln,在release|x64模式下,在解决方案资源管理器—>CMakeTargets—>右键点击ALL_BUILD–>生成。
- 同样在release|x64模式下,在解决方案资源管理器—>CMakeTargets—>右键点击INSTALL–>生成。
没有任何报错信息就是编译完成,在XXX\lib\python3\Release文件夹下可以看到cv2.cpxxx-win_amd64.pyd文件。
XXX是编译opencv保存的文件夹位置(博主是opencv-4.8.0-vs2019-64),cpxx是python版本(博主是cp310)
同时,在虚拟环境中,可以在路径Lib\site-packages下看到cv2文件夹
进入cv2目录打开config.py可以看到虚拟环境opencv_onnx_gpu依赖于cmake编译的opencv(where to build the binaries)。
博主将依赖的opencv拷贝到了虚拟环境中,并修改了依赖的路基。
可能出现的问题
cmake编译过程中可能出现的问题
cmake编译出现Download failed的问题。
在where to build the binaries位置里面有个CMakeDownloadLog.txt,将里面下载链接复制到浏览器进行下载,
将其和where is the source code里面的.cache文件夹里面内容相对应,下图是下载失败时候,文件大小是0KB,手动下载完成后进行替换。
注意用来替换的文件的名称要与对应空文件的名称保持一致。
对于部分文件则需要将网页以另存为的方式进行替换,注意一定不要以复制网页内容粘贴到空文件的方式进行替换,这是无效的的。
将整个.cache都用同样的方式进行处理。
强调一点,出现这种问题,可以暂时先走完CMake编译过程,因为每一次Configuring都会有新的下载内容,然后再一次性将.cache的内容进行完整的替换,最后进行Configuring和Generate。
VS2019编译过程中可能出现的问题
通常是对于部分资源,vs2019没有管理员操作权限,因此只需要用管理员身份重新打开进行操作即可。
测试使用GPU
这里用一段简单的python代码验证安装完成的opencv是否支持gpu设备。
import cv2
# 检查是否支持CUDA
if cv2.cuda.getCudaEnabledDeviceCount():
print("检测到支持CUDA的设备数量:", cv2.cuda.getCudaEnabledDeviceCount())
else:
print("未检测到支持CUDA的设备")
验证成功,oepncv-cuda版本源码编译成功。
总结
尽可能简单、详细的介绍windows10下Python版本opencv4.8.0-cuda版本用源码进行编译的详细流程。