Оригинал статьи - OpenCV-CUDA-installation.
Это перевод инструкции по сборке OpenCV-CUDA для Python 3 на Windows 10/11.
Работает только с видеокартами Nvidia.
Если вы просто хотите собрать модуль OpenCV для Python 3, то пропустите параграфы, связанные с CUDA.
Данная инструкция основана на:
- статье от Anindya - пошаговая сборка с помощью CMake GUI
- статье от James Bowley - сборка с помощью консоли CMake и решение некоторых проблем
Статей выше будет достаточно для большинства случаев.
Но в каких-то, даже если модуль был успешно установлен в Python, вы все равно можете увидеть это сообщение,
когда импортируете OpenCV через import cv2:
ImportError: DLL load failed while importing cv2: The specified module could not be found.
Этот случай подробно описан в разделе по устранению неполадок и почти полностью основан на этом большом GitHub issue. В общем, вся ваша сборка, вероятно, полностью удачна, это просто может быть Python не смог прочесть переменные окружения.
Протестировано на Windows 10 20H2 с процессором i7-10700 2.90ГГц и видеокартой GeForce RTX 2080 Ti
Софт:
- Python 3.8.10
- OpenCV 4.5.5
- NumPy 1.21.6
- CUDA Toolkit v11.6
- cuDNN v8.3.3
- Visual Studio Community 2019 v16.11.13
- CMake 3.19.1
Все это делалось в апреле 2022 года
P.S.: в сентябре 2022 года все повторно проделано без проблем на таком же ПК, но уже на Windows 11, и на ноутбуке с
процессором i5 и старым ГПУ Quadro.
P.P.S.: процесс успешно повторен в конце 2023 года (без CUDA) на ноутбуке (Windows 11, i7 8-го поколения, Intel UHD
Graphics 620) с Python 3.10 и OpenCV 4.9.
P.P.P.S: в конце 2024 года все работает (с CUDA 11.6, Windows 11, Ryzen 5 5600x, RTX 2060 Super, Python 3.10, OpenCV
4.9.0)
Установите Python 3.x любым удобным для вас
способом (оф. сайт, Anaconda, магазин
Майкрософт или создать виртуальное окружение).
Убедитесь, что у вас установлен модуль NumPy, иначе сделайте это в консоли pip install numpy. Удалите все версии
OpenCV pip uninstall opencv-python и pip uninstall opencv-contrib-python. Удалите папку
ВАШ_ПУТЬ_К_ПАПКЕ_С_PYTHON\Lib\site-packages\cv2 (Python обычно находится в AppData\Local\Programs)
Скачайте Visual Studio (желательно 2019 года, скачать), выставите галочки как на скриншоте ниже:
Рекомендуется использовать английский язык, так как далее настройки будут приведены на этом языке. После всего нажмите установить (Install).
Убедитесь, что ваша видеокарта поддерживает CUDA, и узнайте соответственно версию CUDA
Toolkit здесь. Сначала находите поддерживаемую архитектуру (вторая
таблица, колонка "Compute capability"), потом по зеленым квадратикам смотрите версию CUDA Toolkit для данной
архитектуры (первая таблица, колонка CUDA SDK version).
Скачайте и установите CUDA Toolkit в соответствии с вашей
видеокартой. Или же проверьте, что это уже установлено по пути C:\Program Files\NVIDIA GPU Computing Toolkit.
Аналогично для cuDNN согласно установленной версии CUDA Toolkit (для
скачивания нужно зарегистрироваться)
Проверьте, что добавились переменные окружения CUDA_PATH и CUDA_PATH_Vxx_x. Они должны указывать на путь, где
установилась CUDA.
Скопируйте все файлы в подпапках cuDNN (bin, include, lib\x64) в одноименные папки CUDA (путь по умолчанию -
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\vXX.X)
Скачайте и распакуйте OpenCV и OpenCV-contrib (версии должны совпадать)
Создайте папку build с вашими распакованными OpenCV папками:
Измените конец файла OpenCVDetectPython.cmake в папке opencv-x.x.x\cmake. Переместите второй elseif выше над первым:
Это сделает приоритет на использование Python 3 для сборки.
Укажите пути к папке OpenCV и папке, где будет выполнена сборка:
Нажмите Configure и выберите x64 в поле Optional platform for generator. Далее нажмите Finish, чтобы начать первый этап конфигурации.
Когда все готово, измените следующие параметры:
| Name (имя) | Value (значение) |
|---|---|
| ENABLE_FAST_MATH | ✅ |
| OPENCV_DNN_CUDA | ✅ |
| OPENCV_EXTRA_MODULES_PATH | Путь до папки modules в opencv-contrib-x.x.x |
| OPENCV_PYTHON3_VERSION | ✅ |
| WITH_CUDA | ✅ |
Заметьте, что любые пути, в том числе в параметре OPENCV_EXTRA_MODULES_PATH, должны иметь /, не \. Пример - C:/opencv-contrib-x.x.x/modules.
Проверьте параметры, начинающиеся с PYTHON3_, чтобы они соответствовали тем значениям, которым вы ожидаете.
Нажмите Configure снова.
Измените еще 2 параметра:
| Name (имя) | Value (значение) |
|---|---|
| CUDA_FAST_MATH | ✅ |
| CUDA_ARCH_BIN | x.x |
Параметр CUDA_ARCH_BIN должен быть в соответствии с вашей видеокартой. Например значение 7.5 будет для RTX 2080 Ti.
Нажмите Configure для финального этапа конфигурации.
Когда все выполнилось, убедитесь, что у вас нет ничего, выделенного красным слева.
Далее нажмите Generate. Дождитесь окончания процесса, потом можно выходить из CMake.
Откройте файл OpenCV.sln, созданный в папке build.
В верхней панели перейдите Tools ➔ Options, затем Projects and Solutions ⭢ Web Projects. Снимите галочку с последнего параметра и перезапустите Visual Studio (запуск также через двойное нажатие по OpenCV.sln).
Измените режим сверху с Debug на Release
Справа в обозревателе решений (Solution Explorer) раскройте меню CMakeTargets, правой кнопкой мыши по ALL_BUILD и выберите Build. Это займет у вас около 30 мин.
Те же действия повторите для пункта INSTALL (ниже ALL_BUILD).
После проверьте, есть ли ошибки. Если их нет, то все готово 🥳.
Первым делом откройте привычным образом Python и выполните эти строки, чтобы убедиться, что все получилось:
import cv2
print(cv2.__version__)
print(cv2.cuda.getCudaEnabledDeviceCount())Если работает, мои поздравления 👐
Если же не сработало, то, возможно, у вас эта проблема
ImportError: DLL load failed while importing cv2: The specified module could not be found.. Ее решение описано в начале.
Другие ошибки и проблемы можно посмотреть здесь.
У вас должна быть папка cv2 в вашей папке с Python - ВАШ_ПУТЬ_К_ПАПКЕ_С_PYTHON\Lib\site-packages.
Если ее нет, то можете попробовать изменить 2 параметра в CMake конфигурации:
| Name | Value |
|---|---|
| BUILD_SHARED_LIBS | 🔳 |
| OPENCV_FORCE_PYTHON_LIBS | ✅ |
Потом нажмите Generate и проделайте заново сборку в Visual Studio.
В IDE с подсказками (например PyCharm) попробуйте напечатать import cv2, затем cv2. и посмотрите подсказки. Если они появились, то все хорошо.
Проверьте, что установленные библиотеки вашей сборкой не вызывают ошибку импорта. Чтобы это сделать, вы можете вручную добавить DLL файлы:
import os
os.add_dll_directory('C:/path_to_opencv_build_folder/install/x64/vc16/bin')
import cv2 Этот импорт должен быть выполнен по умолчанию в файле config.py в папке cv2 и, возможно, сам по себе не решит проблему.
Проблема скорее всего связана с другими библиотеками, незагруженными Python, даже если они добавлены в переменную окружения "PATH".
Вы можете починить это, добавив все PATH переменные в скрипт с помощью os.add_dll_directory(), пока это работает. Или же используйте Dependency walker, чтобы найти недостающие DLL файлы.
Открытие файла cv2.cp38-win_amd64.pyd (или .pyd файла, соответствующего вашей версии Python) с помощью Dependency Walker может дать вам список недостающих DLL файлов. Однако даст еще много DLL файлов от Microsoft (начинаются с API-MS-... или EXT-MS-...), что на самом деле не влияет на ошибку import error. Затем вы можете попробовать добавить вручную недостающие библиотеки и посмотреть, решает ли это проблему.
Решение, о котором говорится в этом GitHub issue, а также упомянутое в начале этой инструкции, заключается в том, что использование Anaconda Python сработало, поэтому, имея Python 3.8 Anaconda, я добавил путь C:/Users/username/Anaconda3/Library/bin в мой скрипт, и все заработало.
Оказывается, недостающими библиотеками у меня были hdf5.dll и zlib.dll из >200 DLL файлов, расположенных там. Поэтому они добавлены в этот репозиторий, если вы не хотите устанавливать Anaconda.
Когда вы разместили папки, содержащие недостающие DLL файлы, у вас есть несколько опций, чтобы навсегда решить import error:
- Скопируйте файлы в папку
ПУТЬ_К_ПАПКЕ_OPENCV_BUILD/install/x64/vc16/bin(легко, но не идеально) - Добавьте
import osиos.add_dll_directory('...')в любой скрипт, использующий OpenCV (сойдет, но неудобно) - Добавьте все необходимое
os.add_dll_directory()в файл__init__.pyизcv2прямо после строчки__all__ = [](идеальный вариант)
Если что-то из этого раздела решило ImportError: DLL load failed while importing cv2: The specified module could not be found, это замечательно. Если нет, то рекомендую пройтись по этому GitHub issue, может тут найдете решение.








