安装cuda支持的opencv-python Windows版本(包含常见错误处理)

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持!
博主链接

本人就职于国际知名终端厂商,负责modem芯片研发。

在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G技术研究。

博客内容主要围绕:

5G/6G协议讲解

高级C语言讲解

Rust语言讲解

文章目录

  • [一、安装cuda支持的opencv-python Windows版本](#一、安装cuda支持的opencv-python Windows版本)
    • [1.1 基础软件包准备](#1.1 基础软件包准备)
      • [1.1.1 检查是否安装了NVIDIA CUDA Toolkit](#1.1.1 检查是否安装了NVIDIA CUDA Toolkit)
      • [1.1.2 安装cudnn](#1.1.2 安装cudnn)
    • [1.2 安装cuda支持的opencv-python](#1.2 安装cuda支持的opencv-python)
      • [1.2.1 首先需要下载opencv和opencv-contrib](#1.2.1 首先需要下载opencv和opencv-contrib)
      • [1.2.2 解压上面的安装包,并创建下面的目录结构](#1.2.2 解压上面的安装包,并创建下面的目录结构)
      • [1.2.3 安装numpy、opencv-python、opencv-contrib-python](#1.2.3 安装numpy、opencv-python、opencv-contrib-python)
    • [1.3 使用cmake-gui配置项目参数](#1.3 使用cmake-gui配置项目参数)
      • [1.3.1 配置opencv代码目录和编译目录](#1.3.1 配置opencv代码目录和编译目录)
      • [1.3.2 配置编译器,并初次构建](#1.3.2 配置编译器,并初次构建)
      • [1.3.3 配置宏定义,开启cuda功能](#1.3.3 配置宏定义,开启cuda功能)
      • [1.3.4 继续配置宏定义](#1.3.4 继续配置宏定义)
      • [1.3.5 查询NVIDIA GPU算力,并配置相关宏定义](#1.3.5 查询NVIDIA GPU算力,并配置相关宏定义)
      • [1.3.6 检查python版本是否正确](#1.3.6 检查python版本是否正确)
      • [1.3.7 生成配置文件](#1.3.7 生成配置文件)
    • [1.4 编译和安装](#1.4 编译和安装)
      • [1.4.1 打开vs2022构建项目](#1.4.1 打开vs2022构建项目)
      • [1.4.2 安装](#1.4.2 安装)
    • [1.5 测试安装正确性](#1.5 测试安装正确性)
  • 二、常见错误处理
    • [2.1 CUDA Toolkit 版本太低](#2.1 CUDA Toolkit 版本太低)
    • [2.2 cuDNN宏定义没有指定到具体的库文件名](#2.2 cuDNN宏定义没有指定到具体的库文件名)
    • [2.3 python加载cv2的时候显示 dll 加载失败](#2.3 python加载cv2的时候显示 dll 加载失败)
    • [2.4 无法打开文件"pythonxxx_d.lib"](#2.4 无法打开文件“pythonxxx_d.lib”)

一、安装cuda支持的opencv-python Windows版本

1.1 基础软件包准备

需要安装CUDA ToolkitNVIDIA cudnnvs2022cmakepython,这一节主要介绍一下CUDA ToolkitNVIDIA cudnn的安装,其他的都比较常用了,相信大家已经在使用了。

1.1.1 检查是否安装了NVIDIA CUDA Toolkit

在Windows命令行窗口输入

bash 复制代码
nvidia-smi

查看是否安装了cuda toolkit,如果显示下面的内容表示已经安装了

如果没有安装需要登陆NVIDIA网站,下载最新版本的cuda toolkit并安装。

1.1.2 安装cudnn

从NVIDIA下载cudnn版本,下载后正常安装就可以。

1.2 安装cuda支持的opencv-python

1.2.1 首先需要下载opencv和opencv-contrib

opencv
opencv-contrib

1.2.2 解压上面的安装包,并创建下面的目录结构

1.2.3 安装numpy、opencv-python、opencv-contrib-python

bash 复制代码
pip install numpy
pip install opencv-python
pip install opencv-contrib-python

1.3 使用cmake-gui配置项目参数

1.3.1 配置opencv代码目录和编译目录

1.3.2 配置编译器,并初次构建

1.3.3 配置宏定义,开启cuda功能

宏名
WITH-CUDA ON
OPENCV-DNN-CUDA ON
ENABLE_FAST_MATH ON
OPENCV_ENABLE_NONFREE ON
BUILD_opencv_world ON

上面都是布尔参数,下面配置的是opencv的外部库,

执行配置过程,正常会失败,没关系我们还有一些参数没有配置

1.3.4 继续配置宏定义

宏名
CUDA_FAST_MATH ON
CMAKE_CONFIGURATIONTYPES Release

下面配置的是cudnn的库(一定要明确到具体的库文件,不能只定位到目录,感觉是bug)

1.3.5 查询NVIDIA GPU算力,并配置相关宏定义

进入cuda toolkit安装目录(默认安装目录C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7\extras\demo_suite),在cmd中执行deviceQuery.exe

可以看到博主的GPU能力是8.6,配置下面的宏定义

宏名
CUDA_ARCH_BIN 8.6

执行配置过程

1.3.6 检查python版本是否正确

博主的电脑中有多个python版本,之前就遇到过实际使用的python版本与cmake自动检测的python版本不一致,导致显示安装成功,但是没有实际的效果。下面是cmake自动检测的python版本

如果你使用的python版本与自动检测的不一致,可以参考下面的宏定义修改python版本

1.3.7 生成配置文件

1.4 编译和安装

1.4.1 打开vs2022构建项目

右键ALL_BUILD选择生成,此时就开始了漫长的编译过程,差不多需要60分钟

1.4.2 安装

右键INSTALL选择生成,此时就开始了安装过程

1.5 测试安装正确性

执行下面的代码

python 复制代码
import os
os.add_dll_directory("C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v12.6\\bin")
os.add_dll_directory("C:\\Program Files\\NVIDIA\\CUDNN\\v9.3\\bin\\12.6")
import cv2

count = cv2.cuda.getCudaEnabledDeviceCount()
print(count)

可以看到输出的结果为1,表示已经成功安装了cuda使能的opencv-python。

二、常见错误处理

2.1 CUDA Toolkit 版本太低

问题现象:fatal error C1189: #error: -- unsupported Microsoft Visual Studio version! Only the versions between 2017 and 2022 (inclusive) are supported! The nvcc flag '-allow-unsupported-compiler' can be used to override this version check; however, using an unsupported host compiler may cause compilation failure or incorrect run time execution. Use at your own risk.

解决方法:可以参考 1.1.1节更新 CUDA Toolkit,更新后需要同步更新下面的宏参数:

2.2 cuDNN宏定义没有指定到具体的库文件名

问题现象:提示 x64.lib not found in opencv_world.vcxproj

解决方法:将宏变量CUDNN_LIBRARY指定到具体的库文件名。如果只是指定到x64文件夹,会提示无法打开x64.lib文件;如果指定到lib文件夹,会提示无法打开lib.lib文件。

2.3 python加载cv2的时候显示 dll 加载失败

问题现象:提示 "A dynamic link library (DLL) initialization routine failed"

bash 复制代码
Traceback (most recent call last):
  File "d:\programming\fanduel-boggle-cheat\opencv_cuda_cudnn.py", line 4, in <module>
    import cv2
  File "C:\Users\evank\anaconda3\envs\opencv_cuda_cudnn\Lib\site-packages\cv2\__init__.py", line 181, in <module>
    bootstrap()
  File "C:\Users\evank\anaconda3\envs\opencv_cuda_cudnn\Lib\site-packages\cv2\__init__.py", line 153, in bootstrap
    native_module = importlib.import_module("cv2")
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\evank\anaconda3\envs\opencv_cuda_cudnn\Lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ImportError: DLL load failed while importing cv2: The specified module could not be found.

解决方法:需要指定cudnn和cuda的bin目录

python 复制代码
import os
os.add_dll_directory("C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v12.6\\bin")
os.add_dll_directory("C:\\Program Files\\NVIDIA\\CUDNN\\v9.3\\bin\\12.6")
import cv2

count = cv2.cuda.getCudaEnabledDeviceCount()
print(count)

2.4 无法打开文件"pythonxxx_d.lib"

问题现象:提示无法打开文件"pythonxxx_d.lib"

解决方法:主要因为使用vs2022编译方式为Debug,并不是Release。项目构建方式换成Release就可以了。pythonxxx_d.lib是CPython的debug版本。


相关推荐
魔道不误砍柴功13 分钟前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
_.Switch38 分钟前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
测开小菜鸟2 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
萧鼎3 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
弗锐土豆3 小时前
Windows系统中Oracle VM VirtualBox的安装
windows·虚拟机·virtualbox
学地理的小胖砸3 小时前
【一些关于Python的信息和帮助】
开发语言·python
疯一样的码农3 小时前
Python 继承、多态、封装、抽象
开发语言·python
秋の花3 小时前
【JAVA基础】Java集合基础
java·开发语言·windows
Python大数据分析@4 小时前
python操作CSV和excel,如何来做?
开发语言·python·excel
黑叶白树4 小时前
简单的签到程序 python笔记
笔记·python