1、提前准备
vs2019、opencv4.4.0、opencv-contribute4.4.0、CUDA Toolkit 11.8(不能高于自己电脑的CUDA版本)、CUDNN8.9.6
ps:先提前准备环境
1)cmd中查看:nvidia-smi查看自己的显卡信息,不存在下述信息的话则需先安装英伟达显卡驱动程序。
从下图可知,本机显卡驱动支持的cuda最高版本为12.2,那么只需要安装比12.2低或者相同的CUDA库即可。
需要注意的是,有些高版本的cuda不支持vs2022,比如cuda11.2最高只支持vs2019,而不支持vs2022。
2)安装CUDA及CUDNN
安装完CUDA后将CUDNN内的文件拷贝到CUDA安装文件夹,与文件夹内的合并。
指令:nvcc -V
在控制台中输入bandwidthTest.exe及deviceQuery.exe的所在目录,如我的:
F:\installfile\NVIDIA GPU Computing Toolkit\CUDA\v11.8\extras\demo_suite
运行该程序:./bandwidthTest.exe及 ./deviceQuery.exe
出现Result = PASS信息表示成功安装CUDA及CUDNN
2、cmake配置编译选项时出现的问题
Policy CMP0148 is not set: The FindPythonInterp and FindPythonLibs modules are removed. Run "cmake --help-policy CMP0148" for policy details.
解决办法:在文件OpenCVUtils.cmake
F:\installfile\opencv4.4.0\opencv+contrib+gpu\sources\cmake\OpenCVUtils.cmake
的第一行添加
if(POLICY CMP0148)
cmake_policy(SET CMP0148 OLD)
endif()
if(POLICY CMP0146)
cmake_policy(SET CMP0146 OLD)
endif()
3、若用vs2022编译的话可能会在编译时出现很多报错,因此改为vs2019来配置及编译。
4、配置步骤:
1)打开cmake,输入源码路径及生成工程的路径,后
2)Configure结束后,在search框里搜索并配置一些选项:
- 勾选 BUILD_opencv_world(它会将生成的所有库都集中在opencv_world440.lib或opencv_world440d.lib一个包中,而不是分散存放的,便于后续配置工程项目)
- 配置 OPENCV_EXTRA_MODULES_PATH,填写contrib源码的modules文件夹的位置,如我的:
F:\installfile\opencv4.4.0\opencv+contrib+gpu\opencv_contrib-4.4.0\modules
- 搜索“cuda”,勾选 BUILD_CUDA_STUBS、OPENCV_DNN_CUDA、WITH_CUDA
- 勾选 ENABLE_FAST_MATH
- 勾选 OPENCV_ENABLE_NONFREE
- 取消勾选 OpenCV_GENERATE_SETUPVARS
- 分别搜索“python”,“java”,“js”,“tests”,分别取消勾选所有已经勾选的python、java、js、tests相关选项
3)点击Configure进行第二次Configure
4)新配置以下
- 勾选 CUDA_FAST_MATH
- CUDA_ARCH_BIN 填写对应GPU的算力指数,如果已经有了多个值,可以把其他的值删除以加速后续编译,算力指数查询链接:CUDA GPUs - Compute Capability | NVIDIA Developer
5)再次点击Configure,同时检查一下生成信息:
没有报错的话,接着点击Generate生成工程。
6)在自己camke配置的工程目录下,打开生成的工程
- 选择Release(或Debug)和x64平台
- 右键ALL_BUILD工程,点击 生成
- 右键INSTALL工程,点击 仅用于项目 点击 仅生成INSTALL
至此编译结束,编译生成的文件在上述步骤二配置cmake时指定的build文件夹下的install文件夹中。
7)配置vs的opencv工程:常规的添加库目录、包含目录以及附加依赖库,并用以下代码来检验opencv库是否具备CUDA的支持
#include <opencv2/core.hpp>
#include <opencv2/core/cuda.hpp>
#include <iostream>
int main()
{
std::cout << "OpenCV version: " << CV_VERSION << std::endl;
// 检查是否有可用的 CUDA 设备
if (cv::cuda::getCudaEnabledDeviceCount() > 0)
{
std::cout << "CUDA is enabled and available devices found." << std::endl;
}
else
{
std::cout << "CUDA is not enabled or no CUDA devices found." << std::endl;
}
return 0;
}