opencv大多数只使用到了cpu的版本,实际上对于复杂的图像处理过程用cuda(特别是高分辨率的图像)可能会有加速效果。是否需要使用cuda需要思考:
- 1、opencv的cuda库是否提供了想要的算子。在CUDA-accelerated Computer Vision你可以看到cv的cuda库提供了哪些方法。
- 2、如果要使用cv的cuda库,会涉及到数据从cpu和gpu之间的交换。一张图片首先会被cpu读取到内存中,然后通过api将cpu中的数据搬运到gpu中,而cpu和gpu之间的数据搬运也是很耗时的,比如
gpu_dst.download(dst_cpu)
将gpu_dst数据搬运到dst_cpu,数据是8976*4960*3,耗时约37ms,如果你的图像处理比较简单,说不定数据搬运的耗时比直接在cpu上运行更长。
1、带cuda的opencv安装
这里的前提是你的nvidia驱动、cuda以及cudnn都安装完成,可以正常使用。
首先下载版本一致的opencv和opencv-contrib(cuda库所在包),然后解压待用。
然后查询你显卡的Compute Capability,进入opencv-4.8.1后创建build文件夹,终端在build中打开后,执行:
cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D BUILD_CUDA_STUBS=ON \
-D WITH_CUDA=ON \
-D CUDA_ARCH_BIN=8.9 \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.8.1/modules ..
注意,CUDA_ARCH_BIN
是你查询到自己显卡的Compute Capability,OPENCV_EXTRA_MODULES_PATH
指向你的opencv_contrib-4.8.1/modules。(最后的..
不能省略)
可以看到成功检测到我的11.8的cuda,但是没有cuDNN。不知道是不是新版的原因,我安装好cudnn后通过命令cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
查询cudnn版本没有任何输出,但是确实存在cudnn.h
,并在在使用cuda时也没有问题,就没有管这个问题了(后面在opencv使用cuda也没有报错)。
然后:sudo make –j15
,表示使用15个线程make,因cpu而异。
最后sudo make install
。
后续的操作参考ubuntu20.04+opencv+vscode添加环境变量。
2、测试
编写c++代码测试:
#include <opencv2/opencv.hpp>
#include <opencv2/core/cuda.hpp>
/