目录
- 准备工作
- cmake 编译
- vs 编译
- 验证
- 常见问题解决
- 附录:cmake 配置日志
opencv 是一个开源计算机视觉库,提供了许多图像处理和计算机视觉算法的实现。它支持多种编程语言,包括 c++、python、java 等。
opencv-python 是 opencv 的 python 接口,它提供了 python 开发者使用 opencv 库的便利性。它可以在 python 中使用 opencv 的所有功能,并且可以与其他 python 库集成,如 numpy、scipy 等。
opencv 中提供了 gpu 模块,可以用来加速图像处理的相关运算。opencv 的 gpu 模块是使用 cuda 编写的。
opencv 官方关于 cuda 的说明及范例:https://opencv.org/
ⅰ、准备工作
硬件环境
- 需要带 nvidia 显卡(n 卡)
软件环境
- 下载 opencv 源码:opencv-4.7.0.tar.gz
- 下载地址:opencv releases
- 下载 opencv contrib 源码:opencv_contrib-4.7.0.zip
- gitee 镜像:qianjide/opencv_contrib
- github 官网(若无法访问):opencv/opencv_contrib
目录结构说明:
把代码解压到指定目录(例如 e:\code\external\opencv47)。
重要提示:源代码目录下必须事先拷贝好 .cache 文件夹,以避免编译时下载失败。
- 安装 cmake:推荐版本 cmake-3.26.0-windows-x86_64.msi。
- 安装 anaconda:推荐 anaconda3-2022.10-windows-x86_64.exe。
- 安装 cuda 开发工具包:
- 本人亲测了不同的 cuda sdk 版本,编译结果如下表:
| 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 界面,设置 opencv 源码路径(source code)和构建路径(build)。
注意:
- 如果要编译 anaconda 内非默认虚拟环境的 python,建议先暂时重命名 base 环境下的 python.exe 和 libs/python312.lib,防止 cmake 错误识别。
- 如果本地安装了多个版本的 cuda sdk,需要先将环境变量 cuda_path 等设置成当前要编译的 cuda 版本。
第一次点击 configure,选择 visual studio 16 2019 和 x64 架构,点击 finish。第一次编译完成后,进行以下配置:
- 编译 world 模块:在 search 框搜 world,勾选 build_opencv_world。这将把所有 opencv 库编译在一起,无需单独添加每个小模块。
- 启用非自由算法:在 search 框搜 non,勾选 opencv_enable_nonfree。
2. 设置 python 路径
此步骤旨在将 cuda 版本的 opencv 安装到 python 环境中。
- 构建 python 绑定:在 search 框搜 build,勾选 build_opencv_python3(若搜索不到需手动添加)。
环境确认:
确认当前使用的 python 环境(如 anaconda base 或自定义虚拟环境)已安装 numpy(编译必需):
conda list pip3 install numpy
手动设置路径:
由于虚拟环境可能未添加到系统环境变量,cmake 可能无法自动找到 numpy 头文件等路径。需在 cmake 界面手动设置以下变量(以 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. 设置 cuda
添加 contrib 模块:在 search 框搜 modules,在 opencv_extra_modules_path 项中,添加 opencv_contrib 源码中的 modules 目录。
- 路径示例:e:/code/external/opencv_contrib-4.7.0/modules
- 注意:必须使用正斜杠 / 或双反斜杠 \\。若不设置,会报错:cuda: opencv requires enabled 'cudev' module from 'opencv_contrib'。
启用 cuda 支持:在 search 框内输入 cuda,勾选以下两项:
- with_cuda
- opencv_dnn_cuda
- (build_cuda_stubs 可选,通常不勾选)
关于 cudnn:如果忘记将 cudnn 解压到 cuda sdk 目录内,解压后必须在 cmake 中点击 delete cache 然后重新 configure,否则会报找不到 cudnn。
关于 nvidia video codec sdk:
- 若不需要视频编解码功能,可在 cmake 中取消勾选 with_nvcuvid 与 with_nvcuvenc。
- 若需要,需下载 nvidia video codec sdk,解压后将 lib 和 interface 中的文件分别复制到 cuda toolkit 的 lib 和 include 目录中。
设置完成后,再次点击 configure,直到下方日志显示 configure done。
数学优化:搜索框输入 fast,勾选 enable_fast_math 和 cuda_fast_math。
- 注:启用此选项可能会牺牲少量精度以换取更快的浮点运算速度。
设置显卡算力:搜索框输入 cuda,找到 cuda_arch_bin。
- 根据显卡型号修改算力值。例如 gtx 1060 对应的算力为 6.1。
- 删除其他不需要的算力版本,仅保留 6.1(或多张显卡对应的算力值,用空格分隔)。
4. 设置 iconv 库
确保相关配置无误后,点击 generate 开始生成工程,直到出现 generating done!。
5. 常见警告和错误处理
(1) 模块下载失败
- 现象:configure 时在 .cache 文件夹下生成的文件大小为 0kb,或 cmake 输出下载失败警告。
- 原因:网络问题导致无法从 github 等源下载依赖文件。
- 解决:
- 查看 d:\build\opencv47\cmakedownloadlog.txt 获取失败文件的下载链接。
- 手动下载这些文件。
- 将下载的文件重命名为 .cache 文件夹中对应的文件名并覆盖。
- 推荐:直接使用作者整理好的包含完整 .cache 文件的源码包。
- 注意:不要注释掉 cmakelists.txt 中的下载语句,否则不会生成必要的缓存文件结构。应注释或删除的是“清理缓存”相关的语句(如果有)。
(2) 警告:opencv_generate_setupvars
- 解决:在搜索框中输入 opencv_generate_setupvars,去除勾选,重新 configure。
(3) 路径格式错误
- 现象:configure 报错,提示 opencv_extra_modules_path 路径错误。
- 解决:确保路径使用正斜杠 / 或双反斜杠 \\,例如 e:/code/external/opencv_contrib47/modules。
(4) python 未被正确识别
- 现象:cmake 未能找到正确的 python 环境。
- 解决:临时重命名 anaconda base 目录下的 python.exe 和 libs/python3xx.lib,让 cmake 在首次 configure 时忽略它们,然后手动指定虚拟环境的路径。
(5) cudnn 版本不匹配
- 现象:报错提示 cudnn 版本与 cuda 不兼容。
- 解决:清除 cmake 缓存并重新 configure。如果修改了环境变量,需重启 cmake gui 以生效。
ⅲ、vs 编译
1. 编译源码
- 点击 cmake 中的 open project,启动 visual studio 2019 加载生成的解决方案。
- 等待加载完毕,顶部工具栏选择 release 和 x64。
- 在“解决方案资源管理器”中,找到 cmaketargets -> all_build。
- 右键点击 all_build -> “生成”。
- 编译过程可能需要一小时左右,直到输出显示全部成功。
- 检查:确保在 bindings 目录下生成了 opencv_python3 项目,否则无法在 python 中使用 cuda 加速。
2. 安装库到 python
- 在“解决方案资源管理器”中,找到 cmaketargets -> install。
- 右键点击 install -> “生成”。
- 等待结束后:
- 在构建目录的 lib\python3\release 下可看到 cv2.cp39-win_amd64.pyd (版本号可能不同)。
- 在 python 环境的 lib\site-packages 目录下(如 d:\rady\anaconda3\lib\site-packages),应能看到 cv2 文件夹及相关文件。
至此,python 环境的 gpu 版本 opencv 已安装成功。
3. 编译报错解决
- 错误:无法解析的外部符号 cv::xfeatures2d::vgg::getdefaultname
- 原因:源代码目录下的 .cache 文件夹内文件缺失或损坏(通常因网络下载失败导致)。
- 解决:将事先下载好的完整 .cache 文件夹覆盖到源码目录 e:\code\external\opencv47 下。
ⅳ、验证
验证方法
方法一:命令行验证
打开 anaconda prompt 或 cmd,运行以下代码:
import cv2 print(cv2.__version__) print(cv2.cuda.getcudaenableddevicecount())
或者一行命令:
python -c "import cv2;print(cv2.__version__);print(cv2.cuda.getcudaenableddevicecount());"
如果输出了版本号且设备计数大于 0,则安装成功。
方法二:jupyter notebook 验证
在 jupyter notebook 中新建单元格,运行上述 python 代码进行验证。
验证失败常见问题
(1) import cv2 报错(转义字符问题)
- 现象:导入时报错,路径相关错误。
- 原因:config.py 文件中使用了 windows 反斜杠 \ 作为路径分隔符,导致转义错误。
- 解决:打开 config.py 和 config-3.xx.py 文件(通常位于 site-packages/cv2 目录下),将所有反斜杠 \ 改为正斜杠 /。
(2) python 版本冲突
- 现象:本地 python 版本与虚拟环境目标版本冲突。
- 解决:
- 设置环境变量 python_executable3 指向虚拟环境内的 python.exe。
- 重启资源管理器 (explorer.exe) 或重启电脑。
- 检查注册表项:
- 计算机\hkey_local_machine\software\python\pythoncore\3.8\pythonpath
- 计算机\hkey_current_user\software\python\pythoncore\${_current_version}\installpath
(3) 多次 import 报错
- 现象:首次 import 失败,修改配置后仍需重启 shell。
- 解决:修改配置文件后,务必完全退出 python shell(运行 quit())并重新进入,或直接重启 ide/终端。
(4) 多虚拟环境与多 cuda 版本
- 若存在多个虚拟环境对应不同 cuda 版本,需确保当前激活的环境变量(特别是 cuda_path)与编译时使用的版本一致,或在切换环境时动态调整。
附录: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)到此这篇关于opencv 4.7 + cuda 11.2 + python 3.9.x 环境搭建的实现步骤的文章就介绍到这了,更多相关opencv cuda python环境搭建内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论