[英]OpenCV Python with CUDA on Windows: DLL Load Failed
我正在尝试让 OpenCV python 绑定与 CUDA 一起使用,但是当我运行
import cv2
我收到以下错误:
OpenCV loader: os.name="nt" platform.system()="Windows"
OpenCV loader: loading config: C:\opencv\build\python_loader\cv2\config.py
OpenCV loader: loading config: C:\opencv\build\python_loader\cv2\config-3.8.py
OpenCV loader: PYTHON_EXTENSIONS_PATHS=['C:/opencv/build/lib/python3/Release']
OpenCV loader: BINARIES_PATHS=['C:/opencv/build/bin/Release']
OpenCV loader: PATH=C:/opencv/build/bin/Release;C:\Program Files\Python38\Scripts\;C:\Program Files\Python38\;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\libnvvp;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\CCM;C:\WINDOWS\CCM;C:\Perl64\c\bin;C:\Perl64\perl\site\bin;C:\Perl64\perl\bin;C:\WINDOWS\CCM;C:\WINDOWS\CCM;C:\WINDOWS\CCM;C:\Program Files\PuTTY\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\;C:\Program Files (x86)\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files\Microsoft SQL Server\120\DTS\Binn\;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files\Git\cmd;C:\Program Files\Git\mingw64\bin;C:\Program Files\Git\usr\bin;C:\Program Files\nodejs\;C:\Program Files (x86)\Yarn\bin\;C:\Program Files\NVIDIA Corporation\Nsight Compute 2019.5.0\;C:\opencv\build\install\x64\vc16\bin\;C:\Users\md249\AppData\Local\Microsoft\WindowsApps;
OpenCV loader: replacing cv2 module
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\opencv\build\python_loader\cv2\__init__.py", line 96, in <module>
bootstrap()
File "C:\opencv\build\python_loader\cv2\__init__.py", line 86, in bootstrap
import cv2
ImportError: DLL load failed while importing cv2: The specified module could not be found.
我设置了以下环境变量:
OPENCV_DIR: C:\opencv\build\
PATH: $PATH;C:\opencv\build\install\x64\vc16\bin\;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\bin
似乎 OpenCV 出于我不理解的原因将二进制文件构建到多个不同的目录,所以我不确定指向 PATH 和 OPENCV_DIR 的位置。
针对cv2.cp38-win_amd64.pyd
运行 Dependency Walker 并不表示 OpenCV 或 CUDA 中缺少任何依赖项。
.pyd 是否动态加载 Dependency Walker 可能无法捕获的任何其他依赖项? C++ 应用程序加载 OpenCV 就好了所以我想这个问题与 .pyd 扩展正在寻找依赖项的位置有关。
希望我已经包含了所有相关信息。
可能是因为你没有安装OpenCV,你下载了它,如果你不想花时间配置额外的路径来确保python找到正确的opencv包,你只需要使用'pip'安装它:
pip install opencv-contrib-python
它可能会解决您的问题,并且C++软件仍然可以使用下载的版本而不会发生冲突。
导入cv2
时我收到了相同的错误消息,但我从源代码编译了OpenCV ,包括来自opencv_contrib的额外模块,因为我想要一个包含cuda*
和python3
模块的Win64
版本。
即使在投入大量时间之后,我也无法提供令人满意的解决方案。 但我的有效解决方法是使用dumpbin或Dependency walker递归查找所有cv2.cp39-win_amd64.pyd
依赖项,并从同一平面目录中提供所有依赖项,包括cv2.cp39-win_amd64.pyd
,您将其添加到PYTHONPATH
。
就我而言,这意味着在从源代码编译OpenCV后执行以下手动步骤:
C:\\opencv-py39
这样的目录。cv2.cp39-win_amd64.pyd
复制到C:\\opencv-py39
。${EXECUTABLE_OUTPUT_PATH)\\*.dll
例如opencv_world455.dll
) opencv_world455.dll
到C:\\opencv-py39
。%CUDA_PATH%\\bin\\*.dll
)复制到C:\\opencv-py39
。%ONEAPI_ROOT%\\tbb\\latest\\redist\\intel64\\vc14\\*.dll
) %ONEAPI_ROOT%\\tbb\\latest\\redist\\intel64\\vc14\\*.dll
到C:\\opencv-py39
。PYTHONPATH=C:\\opencv-py39
。根据您选择的构建选项,此列表可能不确定。
这种解决方法绕过了我遇到的问题,即使环境变量设置正确并且 C++ 示例程序按预期构建和执行,我的cv2.cp39-win_amd64.pyd
的依赖项也没有从它们的特定安装目录加载。 我想这是特定于CPython的共享库加载器的。 我发现有证据表明这个问题可能是在 Python 3.8 中引入的。
使用SysInternals procmon实用程序仔细查看会发现,python 解释器在探测所有配置的 DLL 搜索目录时停止使用正确的模块名称。 即它开始在当前工作目录中寻找opencv_world455.dll
,然后在 Python 目录等中,但是当它开始查看 PATH 的目录时,它使用了错误的模块名称,如<stdin>
或类似的损坏名称。 也许我应该向 CPython 提交一个错误报告......
添加到@salchint解决方法:
我的安装遇到了同样的ImportError
问题并解决了它,这要归功于我旁边的 Anaconda 安装。
事实证明,所有丢失的 DLL 都可以在.../Anaconda3/Library/bin
中找到。 因此,将文件夹包含到您的脚本中:
import os
os.add_dll_directory('path_to_Anaconda/Anaconda3/Library/bin')
为我解决了错误。 请注意,此文件夹在我的路径中,应该可以发现,但 Python 有(或有?)一些问题。
一个更干净的解决方案(但仍然是一种解决方法)是将此命令添加到YOUR_PYTHON_PATH/Lib/site-packages
中cv2
模块的__init__.py
文件
我在这里写得更详细。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.