Opencv4.12.0 (CUDA CUDNN ONNX)编译

Opencv 4.12.0 源码编译

依赖下载

VS2019
opencv-4.12.0
opencv_contrib-4.12.0
onnxruntime-1.18.1
onnxruntime-win-x64-gpu-1.18.1
cudnn-windows-x86_64-8.5.0.96_cuda11-archive
cuda_11.8.0_522.06_windows.exe
nasm-2.16.03-installer-x64
如果访问github下载慢可以访问https://github.akams.cn/加速
注意:必须下载VS2019,使用2022会编译不过,会报CUD版本必须高于12.0,文中中有些图片显示2022,就是因为我踩坑导致,所以各位同志注意一下

准备

nasm安装

安装nasm-2.16.03-installer-x64.exe后,设置系统环境变量中的path

在这里插入图片描述

cuda cudnn 安装

安装cuda_11.8.0_522.06_windows.exe

将下图所选整体复制到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8中
在这里插入图片描述
重启Cmake

Cmake配置

基础配置

在这里插入图片描述
在这里插入图片描述

新增CMAKE_DEBUG_POSTFIX变量

由于我不想debug加后缀d,所以这里新增CMAKE_DEBUG_POSTFIX string类型变量,不填写内容
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

OPENCV_EXTRA_MODULES_PATH

搜索框搜索OPENCV_EXTRA_MODULES_PATH,添加解压的opencv_contrib中的modules的路径
在这里插入图片描述

OPENCV_ENABLE_NONFREE

搜索并勾选OPENCV_ENABLE_NONFREE选项。
在这里插入图片描述

build_opencv_world

build_opencv_world可以将所有opencv的库都打包编译在一起,后续配置C++的opencv环境时不需要自己手动选择添加每个小模块
在这里插入图片描述

OPENCV_DNN_CUDA\OPENCV_DNN_OPENVINO

OPENCV_DNN_CUDA\OPENCV_DNN_OPENVINO☑️
CPU\GPU两种硬件加速模块
在这里插入图片描述在这里插入图片描述

ENABLE_FAST_MATH☑️

用于启用快速数学计算模式,它会牺牲一些精度来换取计算性能的提升
在这里插入图片描述

“python”,“java”,“js”,“tests”

分别搜索“python”,“java”,“js”,“tests”,根据需要选中和取消相关选项,默认都是选中的,我们只需要c++相关的,因此都取消了,点击Configure。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

BUILD_WITH_STATIC_CRT

BUILD_WITH_STATIC_CRT❌ 编译时不启用静态编译
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/5b446536c5864491ade13a772a95618d.png

OPENMP

WITH_OPENMP☑️
MKL_WITHOPENMP
在这里插入图片描述

CUDA 配置

CUDA☑️

在这里插入图片描述
CUDA_ARCH_BIN☑️
CUDA_ARCH_PTX:同CUDA_ARCH_BIN

CUDA_ARCH_BIN:NVIDIA GPU 计算架构版本 的关键编译参数,决定了 CUDA 程序(如 OpenCV 的 CUDA 模块)针对哪些 GPU 架构进行优化和兼容
CUDA_ARCH_BIN 用于指定编译后的程序支持哪些架构,例如:
6.1:支持 Pascal 架构(如 GTX 1080)
7.5:支持 Turing 架构(如 RTX 2080)
8.6:支持 Ampere 架构(如 RTX 3090)
8.9:支持 Ada Lovelace 架构(如 RTX 4090)
生成针对性优化代码
编译器(NVCC)会根据 CUDA_ARCH_BIN 生成对应架构的二进制代码(sm_xx),充分利用该架构的硬件特性(如 Tensor Core、新指令集等),提升运行性能

CUDA_ARCH_PTX:指定要生成 PTX 代码(Parallel Thread Execution,并行线程执行代码,是一种中间表示形式 )的 CUDA GPU 架构。PTX 代码可在不同架构的 GPU 上,由 CUDA 运行时及时编译(JIT)为二进制代码,以适配目标 GPU ,比如设置为 8.6,能让程序对该架构及后续兼容架构的 GPU 有更好的适配性 。

在这里插入图片描述

CUDA_ENABLE_DELAYLOAD☑️

启用 CUDA 延迟加载(Delay-Load)机制。
在这里插入图片描述

CUDA_USE_STATIC_CUDA_RUNTIME❌ 编译时不启用静态编译

在这里插入图片描述

onnx 配置

ONNX

启用ONNX,再次点击configure
在这里插入图片描述
将onnxruntime-1.18.1\include整体复制到onnxruntime-win-x64-gpu-1.18.1中,然后配置onnxrt_root_dir后再次点击configure
在这里插入图片描述
注意:ORT_EP_INCLUDE参数如果没有onnxruntime DirectML 版本的链接库不要填写,下一步的复制文件夹也不用做
在这里插入图片描述
将下图所示文件复制到指示的文件夹中
在这里插入图片描述

生成VS2019方案

点击Generate

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

.cache 依赖文件下载失败解决

由于网络问题,opencv依赖的库都会下载失败,这个时候需要我们手动下载
打开下图文件
在这里插入图片描述
其中#cmake_download 第一个是依赖是文件应该存放的位置与名称,第二个是下载地址
复制下载地址到浏览器下载
在这里插入图片描述
下载完成后将文件改名成一样的名称(所有手动下载的都需要这样改名)在这里插入图片描述注意:有些文件访问后是在网页中呈现,需要手动另存为文件才能过md5验证
也可以直接下载文章顶部的(适合opencv 4.12.0)
在这里插入图片描述

编译

报错解决

CUSTOMBUILD : nvcc warning : The 'compute_35', 'compute_37', 'sm_35', and 'sm_37' architectures are deprecated, and may be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning).

这个报错可以忽略,只是提示后续会弃用较旧的 NVIDIA GPU型号

CUDA4DNN_CHECK_CUDNN(cudnnCreateConvolutionDescriptor(&descriptor));

在这里插入图片描述
这个报错是缺少zlibwapi.dll导致

OpenCV(开源计算机视觉库)是计算机视觉和机器学习领域广泛应用的一个强大工具,它提供了丰富的图像处理、特征检测、模式识别等功能。在这个“OpenCV4.12.0 + CUDA + 扩展模块Contrib+VS2019编译库”项目中,我们将深入探讨如何在Visual Studio 2019环境下,利用CUDA技术来加速OpenCV的计算,并集成OpenCV的扩展模块Contrib。 OpenCV 4.12.0是这个库的最新稳定版本,它包含了许多性能优化和新功能。例如,更新的算法、改进的接口以及对新硬件的支持。CUDA是NVIDIA提供的并行计算平台,通过GPU进行高性能计算,可以显著提升图像处理和计算机视觉任务的速度。将OpenCVCUDA结合,可以充分利用现代GPU的并行计算能力,加快计算密集型操作,如图像金字塔构建、特征匹配和物体检测等。 在编译OpenCV时,需要确保安装了CUDA Toolkit,这是CUDA编程所必需的。安装后,你需要配置OpenCV的CMake构建系统,指定CUDA支持,并设置相应的编译选项。在CMake中,你可以通过设置WITH_CUDA标志为ON来启用CUDA支持。同时,你还需要确保设置正确的CUDA版本和对应的NVIDIA驱动程序。 接下来,OpenCV的扩展模块Contrib包含了更多实验性和专有功能,这些功能可能尚未被纳入OpenCV的主要库中。例如,深度学习模块(DNN)、图像超分辨率模块(SuperRes)和增强现实模块(aruco)等。要集成这些模块,你需要在CMake配置阶段设置WITH_CONTRIB标志为ON。这些额外的模块可以提供更广泛的算法选择,满足更专业或特定的需求。
### 获取 OpenCV 版本与 CUDA 设备信息 在使用 OpenCV 进行计算机视觉任务时,尤其是涉及 GPU 加速的场景,了解当前环境中 OpenCV 的版本以及是否能够访问 CUDA 设备是非常关键的。可以通过以下方式获取相关信息。 #### 获取 OpenCV 版本信息 OpenCV 提供了多种方式来查询其版本信息。推荐使用 `cv2.__version`(注意不是 `__version__`)或 `cv2.getVersionString()` 方法来获取当前安装的 OpenCV 版本。 ```python import cv2 # 方法1:使用 cv2.__version try: print("OpenCV version:", cv2.__version) except AttributeError: print("OpenCV version attribute not found") # 方法2:使用 getVersionString print("OpenCV version via getVersionString:", cv2.getVersionString()) ``` 若上述方法中 `__version` 报错,可能是因为当前 OpenCV 版本未暴露该属性,此时应优先使用 `getVersionString()` 方法获取版本信息[^1]。 #### 检查 CUDA 设备支持情况 如果 OpenCV 是在启用 CUDA 支持的情况下构建的,可以通过 `cv2.cuda.getCudaEnabledDeviceCount()` 方法来查询当前系统中可用的 CUDA 设备数量。 ```python import cv2 # 检查是否有可用的 CUDA 设备 if 'cuda' in dir(cv2): device_count = cv2.cuda.getCudaEnabledDeviceCount() print(f"Available CUDA devices: {device_count}") else: print("OpenCV was not built with CUDA support") ``` 若输出为 `Available CUDA devices: 0`,则表示当前环境中虽然 OpenCV 支持 CUDA,但未检测到任何可用的 CUDA 设备。这可能是因为: - 系统中未安装 NVIDIA 显卡驱动或驱动版本过低; - OpenCV 编译时未正确链接 CUDA 库; - 当前运行环境未正确识别 GPU 设备。 在这种情况下,建议检查 OpenCV编译配置是否启用了 CUDA 支持,并确保系统中已正确安装 CUDA Toolkit 和 cuDNN 库[^3]。 #### 示例输出 假设当前 OpenCV 版本为 4.12.0 且未检测到可用的 CUDA 设备,输出可能如下: ``` OpenCV version: 4.12.0 OpenCV version via getVersionString: 4.12.0 Available CUDA devices: 0 ``` 此输出表明 OpenCV 已成功加载,但未能访问任何 CUDA 设备进行加速计算。 ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值