OpenCV 4.7 + CUDA 11.2 + Python 3.9.x 環(huán)境搭建的實(shí)現(xiàn)步驟
目錄
- 準(zhǔn)備工作
- CMake 編譯
- VS 編譯
- 驗(yàn)證
- 常見問題解決
- 附錄:CMake 配置日志
OpenCV 是一個(gè)開源計(jì)算機(jī)視覺庫,提供了許多圖像處理和計(jì)算機(jī)視覺算法的實(shí)現(xiàn)。它支持多種編程語言,包括 C++、Python、Java 等。
OpenCV-Python 是 OpenCV 的 Python 接口,它提供了 Python 開發(fā)者使用 OpenCV 庫的便利性。它可以在 Python 中使用 OpenCV 的所有功能,并且可以與其他 Python 庫集成,如 NumPy、SciPy 等。
OpenCV 中提供了 GPU 模塊,可以用來加速圖像處理的相關(guān)運(yùn)算。OpenCV 的 GPU 模塊是使用 CUDA 編寫的。
OpenCV 官方關(guān)于 CUDA 的說明及范例:https://opencv.org/
Ⅰ、準(zhǔn)備工作
硬件環(huán)境
- 需要帶 NVIDIA 顯卡(N 卡)
軟件環(huán)境
- 下載 OpenCV 源碼:opencv-4.7.0.tar.gz
- 下載地址:OpenCV Releases
- 下載 OpenCV Contrib 源碼:opencv_contrib-4.7.0.zip
- Gitee 鏡像:qianjide/opencv_contrib
- GitHub 官網(wǎng)(若無法訪問):opencv/opencv_contrib
目錄結(jié)構(gòu)說明:
把代碼解壓到指定目錄(例如 E:\code\external\opencv47)。
重要提示:源代碼目錄下必須事先拷貝好 .cache 文件夾,以避免編譯時(shí)下載失敗。
- 安裝 CMake:推薦版本 cmake-3.26.0-windows-x86_64.msi。
- 安裝 Anaconda:推薦 Anaconda3-2022.10-Windows-x86_64.exe。
- 安裝 CUDA 開發(fā)工具包:
- 本人親測了不同的 CUDA SDK 版本,編譯結(jié)果如下表:
| CUDA 版本 | OpenCV 4.7.0 | OpenCV 4.10.0 | OpenCV 4.12.0 |
|---|---|---|---|
| cuda-v11.2 & cudnn8.1.0 | ? | ? | ? |
| cuda-v12.4 & cudnn8.9.7 | ? | ? | ? |
| cuda-v12.6 & cudnn8.9.7 | ? | ? | ? |
- 安裝 Visual Studio 2019。
Ⅱ、CMake 編譯
1. 打開 cmake-gui
按照教程安裝好 CUDA 和 Anaconda 后,打開 CMake 界面,設(shè)置 OpenCV 源碼路徑(Source Code)和構(gòu)建路徑(Build)。
注意:
- 如果要編譯 Anaconda 內(nèi)非默認(rèn)虛擬環(huán)境的 Python,建議先暫時(shí)重命名 base 環(huán)境下的 python.exe 和 libs/python312.lib,防止 CMake 錯(cuò)誤識(shí)別。
- 如果本地安裝了多個(gè)版本的 CUDA SDK,需要先將環(huán)境變量 CUDA_PATH 等設(shè)置成當(dāng)前要編譯的 CUDA 版本。
第一次點(diǎn)擊 Configure,選擇 Visual Studio 16 2019 和 x64 架構(gòu),點(diǎn)擊 Finish。第一次編譯完成后,進(jìn)行以下配置:
- 編譯 World 模塊:在 Search 框搜 world,勾選 BUILD_opencv_world。這將把所有 OpenCV 庫編譯在一起,無需單獨(dú)添加每個(gè)小模塊。
- 啟用非自由算法:在 Search 框搜 NON,勾選 OPENCV_ENABLE_NONFREE。
2. 設(shè)置 Python 路徑
此步驟旨在將 CUDA 版本的 OpenCV 安裝到 Python 環(huán)境中。
- 構(gòu)建 Python 綁定:在 Search 框搜 BUILD,勾選 BUILD_opencv_python3(若搜索不到需手動(dòng)添加)。
環(huán)境確認(rèn):
確認(rèn)當(dāng)前使用的 Python 環(huán)境(如 Anaconda base 或自定義虛擬環(huán)境)已安裝 numpy(編譯必需):
conda list pip3 install numpy
手動(dòng)設(shè)置路徑:
由于虛擬環(huán)境可能未添加到系統(tǒng)環(huán)境變量,CMake 可能無法自動(dòng)找到 numpy 頭文件等路徑。需在 CMake 界面手動(dòng)設(shè)置以下變量(以 Python 3.11 和 3.8 為例):
Python 3.11 示例:
- PYTHON3_EXECUTABLE: D:/tools/anaconda3/envs/py3_11/python.exe
- PYTHON3_INCLUDE_DIR: D:/tools/anaconda3/envs/py3_11/include
- PYTHON3_LIBRARY: D:/tools/anaconda3/envs/py3_11/libs/python311.lib
- PYTHON3_NUMPY_INCLUDE_DIRS: D:/tools/anaconda3/envs/py3_11/Lib/site-packages/numpy/core/include (低版本 numpy) 或 .../numpy/_core/include (高版本 numpy)
- PYTHON3_PACKAGES_PATH: D:/tools/anaconda3/envs/py3_11/Lib/site-packages
Python 3.8 示例:
- PYTHON3_EXECUTABLE: D:/tools/anaconda3/envs/py3_8/python.exe
- PYTHON3_INCLUDE_DIR: D:/tools/anaconda3/envs/py3_8/include
- PYTHON3_LIBRARY: D:/tools/anaconda3/envs/py3_8/libs/python38.lib
- PYTHON3_NUMPY_INCLUDE_DIRS: D:/tools/anaconda3/envs/py3_8/Lib/site-packages/numpy/core/include
- PYTHON3_PACKAGES_PATH: D:/tools/anaconda3/envs/py3_8/Lib/site-packages
3. 設(shè)置 CUDA
添加 Contrib 模塊:在 Search 框搜 MODULES,在 OPENCV_EXTRA_MODULES_PATH 項(xiàng)中,添加 opencv_contrib 源碼中的 modules 目錄。
- 路徑示例:E:/code/external/opencv_contrib-4.7.0/modules
- 注意:必須使用正斜杠 / 或雙反斜杠 \\。若不設(shè)置,會(huì)報(bào)錯(cuò):CUDA: OpenCV requires enabled 'cudev' module from 'opencv_contrib'。
啟用 CUDA 支持:在 Search 框內(nèi)輸入 CUDA,勾選以下兩項(xiàng):
- WITH_CUDA
- OPENCV_DNN_CUDA
- (BUILD_CUDA_STUBS 可選,通常不勾選)
關(guān)于 cuDNN:如果忘記將 cuDNN 解壓到 CUDA SDK 目錄內(nèi),解壓后必須在 CMake 中點(diǎn)擊 Delete Cache 然后重新 Configure,否則會(huì)報(bào)找不到 cuDNN。
關(guān)于 Nvidia Video Codec SDK:
- 若不需要視頻編解碼功能,可在 CMake 中取消勾選 WITH_NVCUVID 與 WITH_NVCUVENC。
- 若需要,需下載 Nvidia Video Codec SDK,解壓后將 Lib 和 Interface 中的文件分別復(fù)制到 CUDA Toolkit 的 lib 和 include 目錄中。
設(shè)置完成后,再次點(diǎn)擊 Configure,直到下方日志顯示 Configure done。
數(shù)學(xué)優(yōu)化:搜索框輸入 fast,勾選 ENABLE_FAST_MATH 和 CUDA_FAST_MATH。
- 注:啟用此選項(xiàng)可能會(huì)犧牲少量精度以換取更快的浮點(diǎn)運(yùn)算速度。
設(shè)置顯卡算力:搜索框輸入 cuda,找到 CUDA_ARCH_BIN。
- 根據(jù)顯卡型號(hào)修改算力值。例如 GTX 1060 對(duì)應(yīng)的算力為 6.1。
- 刪除其他不需要的算力版本,僅保留 6.1(或多張顯卡對(duì)應(yīng)的算力值,用空格分隔)。
4. 設(shè)置 ICONV 庫
確保相關(guān)配置無誤后,點(diǎn)擊 Generate 開始生成工程,直到出現(xiàn) Generating done!。
5. 常見警告和錯(cuò)誤處理
(1) 模塊下載失敗
- 現(xiàn)象:Configure 時(shí)在 .cache 文件夾下生成的文件大小為 0kb,或 CMake 輸出下載失敗警告。
- 原因:網(wǎng)絡(luò)問題導(dǎo)致無法從 GitHub 等源下載依賴文件。
- 解決:
- 查看 D:\build\opencv47\CMakeDownloadLog.txt 獲取失敗文件的下載鏈接。
- 手動(dòng)下載這些文件。
- 將下載的文件重命名為 .cache 文件夾中對(duì)應(yīng)的文件名并覆蓋。
- 推薦:直接使用作者整理好的包含完整 .cache 文件的源碼包。
- 注意:不要注釋掉 CMakeLists.txt 中的下載語句,否則不會(huì)生成必要的緩存文件結(jié)構(gòu)。應(yīng)注釋或刪除的是“清理緩存”相關(guān)的語句(如果有)。
(2) 警告:OPENCV_GENERATE_SETUPVARS
- 解決:在搜索框中輸入 OPENCV_GENERATE_SETUPVARS,去除勾選,重新 Configure。
(3) 路徑格式錯(cuò)誤
- 現(xiàn)象:Configure 報(bào)錯(cuò),提示 OPENCV_EXTRA_MODULES_PATH 路徑錯(cuò)誤。
- 解決:確保路徑使用正斜杠 / 或雙反斜杠 \\,例如 E:/code/external/opencv_contrib47/modules。
(4) Python 未被正確識(shí)別
- 現(xiàn)象:CMake 未能找到正確的 Python 環(huán)境。
- 解決:臨時(shí)重命名 Anaconda base 目錄下的 python.exe 和 libs/python3xx.lib,讓 CMake 在首次 Configure 時(shí)忽略它們,然后手動(dòng)指定虛擬環(huán)境的路徑。
(5) cuDNN 版本不匹配
- 現(xiàn)象:報(bào)錯(cuò)提示 cuDNN 版本與 CUDA 不兼容。
- 解決:清除 CMake 緩存并重新 Configure。如果修改了環(huán)境變量,需重啟 CMake GUI 以生效。
Ⅲ、VS 編譯
1. 編譯源碼
- 點(diǎn)擊 CMake 中的 Open Project,啟動(dòng) Visual Studio 2019 加載生成的解決方案。
- 等待加載完畢,頂部工具欄選擇 Release 和 x64。
- 在“解決方案資源管理器”中,找到 CMakeTargets -> ALL_BUILD。
- 右鍵點(diǎn)擊 ALL_BUILD -> “生成”。
- 編譯過程可能需要一小時(shí)左右,直到輸出顯示全部成功。
- 檢查:確保在 bindings 目錄下生成了 opencv_python3 項(xiàng)目,否則無法在 Python 中使用 CUDA 加速。
2. 安裝庫到 Python
- 在“解決方案資源管理器”中,找到 CMakeTargets -> INSTALL。
- 右鍵點(diǎn)擊 INSTALL -> “生成”。
- 等待結(jié)束后:
- 在構(gòu)建目錄的 lib\python3\Release 下可看到 cv2.cp39-win_amd64.pyd (版本號(hào)可能不同)。
- 在 Python 環(huán)境的 Lib\site-packages 目錄下(如 D:\rady\anaconda3\Lib\site-packages),應(yīng)能看到 cv2 文件夾及相關(guān)文件。
至此,Python 環(huán)境的 GPU 版本 OpenCV 已安裝成功。
3. 編譯報(bào)錯(cuò)解決
- 錯(cuò)誤:無法解析的外部符號(hào) cv::xfeatures2d::VGG::getDefaultName
- 原因:源代碼目錄下的 .cache 文件夾內(nèi)文件缺失或損壞(通常因網(wǎng)絡(luò)下載失敗導(dǎo)致)。
- 解決:將事先下載好的完整 .cache 文件夾覆蓋到源碼目錄 E:\code\external\opencv47 下。
Ⅳ、驗(yàn)證
驗(yàn)證方法
方法一:命令行驗(yàn)證
打開 Anaconda Prompt 或 CMD,運(yùn)行以下代碼:
import cv2 print(cv2.__version__) print(cv2.cuda.getCudaEnabledDeviceCount())
或者一行命令:
python -c "import cv2;print(cv2.__version__);print(cv2.cuda.getCudaEnabledDeviceCount());"
如果輸出了版本號(hào)且設(shè)備計(jì)數(shù)大于 0,則安裝成功。
方法二:Jupyter Notebook 驗(yàn)證
在 Jupyter Notebook 中新建單元格,運(yùn)行上述 Python 代碼進(jìn)行驗(yàn)證。
驗(yàn)證失敗常見問題
(1) import cv2 報(bào)錯(cuò)(轉(zhuǎn)義字符問題)
- 現(xiàn)象:導(dǎo)入時(shí)報(bào)錯(cuò),路徑相關(guān)錯(cuò)誤。
- 原因:config.py 文件中使用了 Windows 反斜杠 \ 作為路徑分隔符,導(dǎo)致轉(zhuǎn)義錯(cuò)誤。
- 解決:打開 config.py 和 config-3.xx.py 文件(通常位于 site-packages/cv2 目錄下),將所有反斜杠 \ 改為正斜杠 /。
(2) Python 版本沖突
- 現(xiàn)象:本地 Python 版本與虛擬環(huán)境目標(biāo)版本沖突。
- 解決:
- 設(shè)置環(huán)境變量 PYTHON_EXECUTABLE3 指向虛擬環(huán)境內(nèi)的 python.exe。
- 重啟資源管理器 (explorer.exe) 或重啟電腦。
- 檢查注冊(cè)表項(xiàng):
- 計(jì)算機(jī)\HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\3.8\PythonPath
- 計(jì)算機(jī)\HKEY_CURRENT_USER\SOFTWARE\Python\PythonCore\${_CURRENT_VERSION}\InstallPath
(3) 多次 import 報(bào)錯(cuò)
- 現(xiàn)象:首次 import 失敗,修改配置后仍需重啟 Shell。
- 解決:修改配置文件后,務(wù)必完全退出 Python Shell(運(yùn)行 quit())并重新進(jìn)入,或直接重啟 IDE/終端。
(4) 多虛擬環(huán)境與多 CUDA 版本
- 若存在多個(gè)虛擬環(huán)境對(duì)應(yīng)不同 CUDA 版本,需確保當(dāng)前激活的環(huán)境變量(特別是 CUDA_PATH)與編譯時(shí)使用的版本一致,或在切換環(huán)境時(shí)動(dòng)態(tài)調(diào)整。
附錄:CMake 3.26 配置日志記錄 (摘要)
Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.17134.
Detected processor: AMD64
CMAKE_VERSION: 3.26.0
CMAKE_SYSTEM: Windows-10.0.17134
CUDA detected: 11.2
CUDA: Using CUDA_ARCH_BIN=6.1
CUDA NVCC target flags: -gencode;arch=compute_61,code=sm_61;-D_FORCE_INLINES
...
General configuration for OpenCV 4.7.0 =====================================
Version control: 703f139
Extra modules:
Location (extra): D:/code/external/opencv_contrib47/modules
Platform:
Host: Windows 10.0.17134 AMD64
CMake: 3.26.0
CMake generator: Visual Studio 16 2019
MSVC: 1929
NVIDIA CUDA: YES (ver 11.2, CUFFT CUBLAS FAST_MATH)
NVIDIA GPU arch: 61
cuDNN: YES (ver 8.1.0)
Python 3:
Interpreter: D:/rady/anaconda3/python.exe (ver 3.9.13)
Libraries: D:/rady/anaconda3/libs/python39.lib
numpy: .../numpy/core/include
install path: D:/rady/anaconda3/Lib/site-packages/cv2/python-3.9
OpenCV modules:
To be built: aruco barcode ... world xfeatures2d ...
Non-free algorithms: YES
-----------------------------------------------------------------
Configuring done (33.5s)
Generating done (41.5s)到此這篇關(guān)于OpenCV 4.7 + CUDA 11.2 + Python 3.9.x 環(huán)境搭建的實(shí)現(xiàn)步驟的文章就介紹到這了,更多相關(guān)OpenCV CUDA Python環(huán)境搭建內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python設(shè)計(jì)一個(gè)代碼統(tǒng)計(jì)工具
這篇文章主要介紹了使用Python設(shè)計(jì)一個(gè)代碼統(tǒng)計(jì)工具的相關(guān)資料,包括文件個(gè)數(shù),代碼行數(shù),注釋行數(shù),空行行數(shù)。感興趣的朋友跟隨腳本之家小編一起看看吧2018-04-04
Python?+?Selenium?實(shí)現(xiàn)模擬登錄jd實(shí)例分享
這篇文章主要介紹了Python?+?Selenium?實(shí)現(xiàn)模擬登錄jd實(shí)例分享的相關(guān)資料,需要的朋友可以參考下2023-06-06
python批量檢查兩個(gè)對(duì)應(yīng)的txt文件的行數(shù)是否一致的實(shí)例代碼
這篇文章主要介紹了python批量檢查兩個(gè)對(duì)應(yīng)的txt文件的行數(shù)是否一致,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Python prettytable模塊應(yīng)用詳解
PrettyTable 是python中的一個(gè)第三方庫,可用來生成美觀的ASCII格式的表格,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-09-09
Windows下安裝python2.7及科學(xué)計(jì)算套裝
這篇文章主要向大家介紹的是在windows系統(tǒng)下安裝python 2.7以及numpy安裝、six安裝、dateutil安裝、pyparsing安裝、matplotlib安裝和scipy安裝的方法,分享給大家,需要的小伙伴可以參考下,相對(duì)來說,windows下的安裝還是比較簡單的。2015-03-03

