[英]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.