前些天在B站上看到用OpenCV调用CUDA加速目标检测和关键点检测的教程,较Pytorch推理速度提升很明显,最近整了个RTX4070,所以就也想来试一试。由于刚换了电脑,没有相关环境,配置过程中踩了一些坑,因此有了这篇记录文章。
目录
- 基本配置
- 前置条件
- 下载和修改OpenCV
- 下载
- 修改配置
- 编译OpenCV
- 1.利用CMake配置OpenCV源代码工程
- 2.Visual Studio 2019 编译OpenCV源代码
- 配置 Visual Studio 2019
- 测试程序
- 参考教程
基本配置
- 系统:Windows11-22H2
- 显卡:RTX4070
- 驱动:CUDA-11.8,cudnn-windows-x86_64-8.9.2.26
- 编译软件:CMake, Visual Studio 2019
- 版本:OpenCV 4.7.0,Contrib 4.7.0
前置条件
安装Visual Studio2019,CMake,CUDA以及cuDNN
- Visual Studio下载地址
- CMake下载链接
- CUDA下载链接
- cuDNN下载链接
VS和CMake安装很简单,就跟普通的软件一样,CUDA和cuDNN的下载和安装可以参考之前的这篇文章
下载和修改OpenCV
下载
地址
- OpenCV
- contrib包
需要注意,下载的OpenCV主包和Contrib包的版本要一致才可以,我用的是4.7.0版本
下载好后,将这两个包解压至同一目录下,方便查找。同时,为了存放编译生成的支持CUDA的OpenCV库,需要创建一个新的文件夹,这里我在同一目录下创建了一个名为opencv_cuda_build的文件夹,具体如图1所示
由于下载下来的OpenCV编译好的包没有CUDA以及contrib包中的相关支持,所以需要源代码编译,生成支持Contrib和CUDA的定制的OpenCV库。从下载的OpenCV源代码到我们加速推理所需要的库文件之间需要经过以下步骤:
- 使用CMake配置OpenCV源代码的工程,生成VS编译所需的工程文件
- 利用VS将源代码编译成相应的库文件
- 将编译生成的OpenCV库文件配置到VS中,方可在VS工程中链接到我们自己编译的库
修改配置
由于某些客观原因,编译OpenCV以及contrib所需的某些库在国内无法下载,因此需要对下载下来的代码配置进行一些修改方可避免缺少某些库导致编译失败。
具体来说,主要是OpenCV的ffmpeg,ippicv和contrib的face,xfeatures2d这几个库。
解决方法就是,修改这几个库的下载地址,在原来的下载地址前增加代理。
例如,在ippicv的ippicv.cmake文件中的原始下载地址
https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/
前面新增一个代理地址
https://ghproxy.com/
修改成这样即可
https://ghproxy.com/https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/
如图2所示
以此类推,ffmpeg的配置文件是opencv\sources\3rdparty\ffmpeg\ffmpeg.cmake,xfeatures2d配置文件是opencv_contrib-4.7.0\opencv_contrib-4.7.0\modules\xfeatures2d\cmake**目录下的download_boostdesc.cmake和download_vgg.cmake**,face的配置文件是F:\packages\opencv_contrib-4.7.0\opencv_contrib-4.7.0\modules\face\CMakeLists。
编译OpenCV
前期工作准备完毕,开始编译我们所需的OpenCV。
1.利用CMake配置OpenCV源代码工程
-
打开CMake软件,Where is the source code这一栏选择我们解压的OpenCV的源代码的路径,我这里是F:/packages/opencv/sources。Where to build the binaries这一栏选择我们创建的opencv_cuda_build文件夹。然后点击Configure进行第一次Configure,在弹出的对话框中选择VS 2019和x64,之后点击finish。
执行完成后界面如下图所示:
-
接下来在CMake搜索框搜索CUDA,勾选弹出的CUDA选项
-
搜索并勾选math相关
-
搜索并勾选NONFREE
-
搜索并勾选BUILD_opencv_world
-
搜索GENERATE_SETUPVARS,取消勾选
-
最后搜索MODULES并添加contrib包的路径
至此,完成这一步的配置选择,第二次点击configure,等待配置完成,如下图:
-
configure完成后,搜索CUDA_ARCH_BIN,根据自己的GPU算力选择保留对应的数值。具体GPU对应的数值可以从Nvidia官网查找。由于40系显卡的计算能力是8.9,而4.7版本的OpenCV支持的最大的计算能力是8.6,所以我这里选择的是8.6
接下来第三次点击configure,等待完成后点击generate如下图所示:
然后就可以点击Open Project打开Visual Studio 2019,至此,CMake完成使命
2.Visual Studio 2019 编译OpenCV源代码
- 打开VS工程后,选择Release x64版本,并在解决方案管理器中的CMakeTargets目录下右键点击ALL_BUILD,选择生成,开始编译。(这一过程需要挺久的,13600K编译大概50分钟左右)
- ALL_BUILD编译完成之后,再选择INSTALL,同样右键执行生成操作
这一步执行完成之后,会在opencv_cuda_build/文件夹下生成install文件夹:
生成的install文件夹下的文件就是我们需要的文件,至此,OpenCV编译完成!
配置 Visual Studio 2019
编译完OpenCV后,需要对VS进行一些配置才能在我们的项目中引用到我们编译的OpenCV库。具体来说主要有
- 添加包含目录
- 添加库目录
- 添加附加依赖项
- 添加环境变量
- 首先,我们创建一个空白的VS C++工程并添加源文件main.cpp,然后选择Release x64,在右边的属性管理器的Release | x64处右键->属性,在弹出来的属性页面的VC++目录选项的包含目录下添加这两个include路径:
F:\packages\opencv_cuda_build\install\include
F:\packages\opencv_cuda_build\install\include\opencv2
- 然后在下面的库目录中添加lib路径:
F:\packages\opencv_cuda_build\install\x64\vc16\lib
- 最后在链接器->输入->附加依赖项选项中添加opencv_cuda_build\install\x64\vc16\lib文件夹下的所有lib文件名,我这里只有opencv_img_hash470.lib和opencv_world470.lib这两个。
- 最后需要将编译的二进制文件路径添加到环境变量中,在系统搜索栏中搜索编辑环境变量,在Path这一栏中添加bin路径:
F:\packages\opencv_cuda_build\install\x64\vc16\bin
至此,VS配置完成,可以在VS中调用我们刚刚编译的支持CUDA的OpenCV了。
测试程序
在刚刚创建的main.cpp中添加如下示例程序:
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/cudaarithm.hpp>
#include <iostream>
using namespace std;
using namespace cv;
using namespace cv::cuda;
int main()
{
// OpenCV版本号
cout << "OpenCV_Version: " << CV_VERSION << endl;
// CUDA
int num_devices = getCudaEnabledDeviceCount();
if (num_devices)
cout << "CUDA is available, num_devices:" << num_devices << endl;
else
cout << "CUDA is not available." << endl;
//读取图片
Mat img = imread("D:/CUDA_ARCH_BIN.png");
imshow("picture", img);
waitKey(0);
return 0;
}
如果能正确显示图片以及CUDA,表明安装成功!
参考教程
- 解决ippicv等下载问题
- OpenCV安装教程
- 之前的安装文章