opencv+opencv_contrib+cuda和VS2022编译
本文介绍使用OpenCV和OpenCV_Contrib源码及Cuda进行编译的过程,编译过程中会用到OpenCV、OpenCV_Contrib、Toolkit、Cmake、VS2022等工具,最终编译OpenCV的Cuda版本。
一、OpenCV下载地址
OpenCV官网下载地址:https://opencv.org/releases/#,选择一个版本下载,下载之后解压或者提取;
OpenCV Gihthub下载地址:https://github.com/opencv/opencv;也可以在Github选择一个版本下载,下载之后解压;
注:从官网使用下载器下载的OpenCV解压后会多一个build文件夹,是已经编译的opencv文件,直接从Github下载的没有这个文件夹,因为需要自己编译Cuda版本的opencv,所以不会用到这个build文件夹,有没有都不影响;
图中左侧opencv4.11.0文件夹就是右侧的sources文件夹(下图)
二、OpenCV_contrib下载地址
OpenCV Gihthub下载地址:https://github.com/opencv/opencv_contrib,和下载OpenCV相同的方式进行下载,注意OpenCV_contrib的版本要与下载的OpenCV的版本一致。下载后解压;
下图中的cuda开头的文件夹就是与cuda相关的文件,
三、Cmake下载
下载Cmake:https://cmake.org/download/,我使用的Cmake4.0.1;
四、Cuda Toolkit下载
1.查看CUDA最高支持版本
在命令窗口中使用nvidia-smi查看电脑的显卡支持的CUDA Toolkit版本(如果nvidia-smi不可用,可能是命令行输错了或者没安装显卡驱动,检查命令行或者下载驱动:https://www.nvidia.cn/drivers/lookup/),下图中CUDA Version12.6代表最高支持CUDA Toolkit12.6的版本;
2.下载CudaToolkit
下载地址:https://developer.nvidia.com/cuda-downloads,下载完成后,进行安装,安装后
在C:\Program Files会有NVIDIA GPU Computing Toolkit文件夹;
3.环境变量配置
安装完成后,系统环境变量中会有以下两个路径;
在环境变量Path中,需要添加以下路径(前两个是安装后自动添加的,所以只需要添加最后一个x64的路径就行):
4.检查CUDA Toolkit版本
在命令窗口输入 nvcc -V(中间有空格)会显示电脑安装的CUDA Toolkit的版本号;
五、cuDNN下载
下载地址:https://developer.nvidia.com/cudnn,下载完成后,将其中的bin文件,lib文件夹,include文件夹,三个文件夹中的文件复制到对应的cuda文件夹中,即C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2文件夹的对应目录中(v12.2是CUDA的版本号,我下载的是12.2),如果不使用cuDNN可以跳过此步骤;
六、编译
1.opencv编译
1.打开Cmake,首先编译opencv,选择Opencv源码文件夹,之后选择新的build文件夹,如下图新建一个build文件夹,我的build文件夹名字为cudaopencv1:
点击左下角的Configure,会弹出以下界面,选择generator,我的需要使用的VS2022,所以我选择的是Visual Studio 17 2022(根据自己的需求选择),之后点击Finish:
2.Configure完成后会有以下界面,Configure过程中会显示warning,提示你版本cmake版本要求或者文件未找到,可以一个一个查看,不是自己需编译的文件就不用管(也可以直接取消勾选,不进行编译);
3.点击Generate,下方会显示Generating done.
4.至此build文件夹(我的build文件夹名为cudaopencv1)中会出现以下文件:
2.OpenCV生成
1.双击打开生成的OpenCV.sln,
2.在VS中设置编译环境Debug或者Release,之后在解决方案管理器中找打CmakeTargerts,右键点击其中的ALL_BUILD,点击生成;
3.在自己的build文件夹中会生成lib文件夹,如下所示
lib文件夹中的内容是刚刚生成的文件,如果是在Debug模式下生成就会有Debug文件夹,如果是Release模式就会有Release文件夹,两种模式都生成,两个文件夹都有;
文件夹中是生成的库文件:
3.编译contrib及CUDA
1.在Cmake中找到OPENCV_EXTRA_MODULES_PATH,设置文件夹为opencv_contrib文件中的modules文件夹路径,我的opencv_contrib路径为:D:/OpenCV4.11/opencv_contrib-4.11.0/modules,如下图:
2.在cmake的search中输入cuda,设置BUILD中的BUILD_CUDA_STUBS为勾选状态,设置WITH中的WITH_CUDA为勾选状态;
3.设置完成后,点击下方的Configure,最下方显示Configuring done.
4.完成Generate之后设置显卡算力参数,在Cmake的Search中搜索ARCH,设置CUDA_ARCH_BIN参数为自己的显卡算力,我的显卡算力为8.6,具体自己的显卡算力可以在Nvidia网站查询:https://developer.nvidia.com/cuda-gpus;
注意:在未点击Generate时搜索不到这个参数,完成一次Generate后才可以搜到这个参数,如果不设置这个参数会导致后边的cudaopencv编译失败;
5.设置CUDA_FAST_MATH为勾选状态:
点击Configure,显示Configuring done后,点击Generate,Generating done
6.检查是否编译成功
a.在Camke的白色区域中,Build中会显示以下目录:
b.在自己的build文件夹中的modules文件夹中(我的build文件夹名字为cudaopencv1),会有以下文件,
至此opencv cuda版本的build完成。
4.使用VS进行生成
打开build文件夹(cudaopencv1),找到OpenCV.sln,双击打开;
在CmakeTargets中找到ALL_BUILD,右键点击生成(此过程比较长,我用了18分钟),
生成完成后,查看自己的build文件夹的lib文件夹,发现与之前相比会多出contrib中的内容
之后点击INSTALL中的仅用于项目的仅生成INSTALL,点击后会在build文件夹中生成一个install文件夹,文件夹中的内容就是编译的全部内容。
install文件夹中的内容:
这里边都是debug模式下编译的库文件,如果需要release模式,在ALL_BUILD生成时,在VS中选择Release,然后再生成INSTALL。
至此,opencv +contrib+cuda编译全部完成。
七、配置及使用
1.配置环境变量
在此电脑->属性->高级系统设置->环境变量->系统变量->Path中增加编译的bin文件夹;
2.配置项目属性
首先配置项目包含目录,在包含目录中添加:D:\OpenCV4.11\cudaopencv1\install\include 和 D:\OpenCV4.11\cudaopencv1\install\include\opencv2;
在库目录中,配置D:\OpenCV4.11\cudaopencv1\install\x64\vc17\lib
在链接器->输入->附加依赖项中,加入build文件夹中所有lib文件名称,文件名很多,所以可以使用命令行一次性全部转换为文本,然后直接复制(详见3.获取所有lib文件名称)
3.获取所有lib文件名称
在命令窗口中输入:dir /b “文件路径”>生成的文本路径;
例如以下截图,会将lib文件夹中的所有文件名字存放到C盘的name文本中;
八、编译过程中可能遇到的问题
1.所有步骤均按照以上过程操作,但是在VS生成过程中,显示:
27>D:\OpenCV4.5.5\opencv\sources\modules\core\include\opencv2/core/cuda/common.hpp(99,27): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int (编译源文件D:\OpenCV4.5.5\opencv\cudaopencv\modules\core\arithm.sse4_1.cpp)
产生这个问题大概率是由于cuda版本与opencv版本的兼容问题,我最开始使用OpenCV4.5.5和CUDA 12.2版本,出现这个问题,后来换成OpenCV4.11和CUDA12.2,编译成功
2.在Cmake过程中出现以下错误,显示:
CMake Error at cmake/OpenCVDetectCUDAUtils.cmake:297 (list):
list GET given empty list
Call Stack (most recent call first):
cmake/OpenCVDetectCUDA.cmake:76 (ocv_set_cuda_arch_bin_and_ptx)
cmake/OpenCVFindLibsPerf.cmake:46 (include)
CMakeLists.txt:800 (include)
cmake检测CUDA架构时未能正确识别电脑GPU的计算能力,如果出现这个问题,在cmake中设置CUDA_ARCH_BIN的值,GPU计算能力查询https://developer.nvidia.com/cuda-gpus