OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。项目源码由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
但在实际使用中,如果是对处理时间要求比较高的场景,使用OpenCV处理图片数据很难满足要求,不过OpenCV支持使用CUDA进行加速,不过支持CUDA加速的依赖包需要我们自行编译才可使用,因此在本次文章中,我们将演示如何使用OpenCV源码自行编译代码文件,来实现CUDA加速。
1. 环境准备
1.1 软件环境
本次编译平台使用的是 Windows 11 系统,使用CMake-gui + VS2022进行源码编译,为了大家更好的复现该项目,此处罗列一下本文所使用的环境:
- CUDA: 12.2, cudnn: 8.9.3
- Cmake: 3.28.0
- Visual Studio 2022
关于以上环境的安装,大家可以查看网上相关文档自行安装即可。
1. 2 源码下载
接下来需要下载OpenCV源码,此处需要下载两个源码,分别是opencv
和opencv_contrib
。下载链接为
opencv:
https://github.com/opencv/opencv/archive/4.8.0.zip
opencv_contrib:
https://github.com/opencv/opencv_contrib/tags
不过在下载时要注意一点,就是要保证opencv
和opencv_contrib
下载的版本要一致,此处我们下载的版本为:4.8.0。下载完成后,将两个文件解压到同一个文件夹中,如下图所示。
2. CMake编译项目
2.1 创建cmake项目
打开CMake软件,设置项目源码路径,并在源码路径下创建一个build
文件夹,并设置编译文件夹,如下图所示:
接下来点击Configure
,进行第一次配置,然后回弹出编译平台选择,此处根据自己电脑的编译软件进行选择,在本文中我们使用的是Visual Studio 2022
,然后选择编译平台为x64
。
第一次配置生成后,输出如下所示:
2.2 设置编译配置
首先添加opencv_contrib
模块的引用,在OPENCV_EXTRA_MODULES_PATH
条目中添加该模块的路径,然后选择OPENCV_ENABLE_NONFREE
,如下图所示:
接下来添加CUDA的设置,首先选择WITH_CUDA
,如下图所示:
然后选择OPENCV_DNN_CUDA
,此处还可以选择OPENCV_DNN_OPENVINO
等不同的模型部署,如下图所示:
最后选择ENABLE_FAST_MATH
此处为了让生成的依赖库文件都集成在一个文件中,方便后面使用,所以此处可以选择BUILD_opencv_world
,如果不选择,生成的 文件将会被拆散成多个文件。
第二次Configure
后,下一步就是需要检查一下其过程是否有异常抛出
2.3 解决异常
2.3.1 文件下载异常
首先查看一下配置输出框是否抛出警告,如果有的话,一定要解决一下,不然后续编译会出错。
当出现上图所示的异常后,就需要手动解决一下该问题,首先找到build\CMakeDownloadLog.txt
文件,然后打开后,查看一下是否有下图所示的文件确实异常。如果有,请自行下载,下载链接如下图所示标注位置,下载后将文件放置在下图所示缺失文件路径,并按照要求修改名称。
2.3.2 解决CUDA版本异常
该异常会在最后编译过程中出现,主要是当CUDA>=12.2
时会出现该问题,因此需要检查一下自己的CUDA
版本是否大于12.2.查看CUDA
版本方式如下图所示。
如果你的CUDA
版本大于12.2,就要根据官方的要求进行修改,官方提供的解决方式链接为:cuda
: fix for compatibility with CUDA Toolkit >= 12.2.0 by cudawarped · Pull Request #24104 · opencv/opencv (github.com)。
其主要修改内容如下图所示。
2.4 编译项目
解决完上述异常后,就可以进行项目编译了,点击Generate
,就可以自动生成项目了。
3. Visual Studio 编译项目
首先我们打开build\
文件夹,可以看到生成的OpenCV.sln
解决方案文件,使用Visual Studio
打开该项目。
然后运行ALL_BUILD
项目即可,此处运行时间会比较长,尤其是再加入CUDA支持后,编译时间会更久。
编译完成后,可以获得下面文件夹内容,此处主要是两个有用的文件夹,一个是install
文件夹,这个文件夹主要是包含的时项目运行的依赖项,包括include/
文件夹以及 .lib
、 .dll
等文件;第二个是python_loader
文件夹,主要是python
运行所需的依赖项。
4. 项目测试
项目编译完成后,最后我们查看一下项目是否编译成功,此处使用cv2.cuda.getCudaEnabledDeviceCount()
接口方法检查一下是否存在在线的CUDA设备,如果存在CUDA设备,将返回设备数量,如果没有,将返回0。如下图所示,在运行后,输出为1,本机设备只存在一个显卡,所以索命该项目已经编译好了。
5. 总结
在本文中,我们实现了OpenCV源码编译,并结合本机安装的CUDA版本,实现了CUDA版本的OpenCV编译,并实现了Python API 以及C++ API 的使用。后续我们将会结合所编译的库进行项目开发以及与普通版本进行对比。