因为算法的需要,正常的CPU算法速度不够需要进行加速,OpenCV中正好加入了GPU计算的模块,OpenCV中有两种GPU的加速方式,一种是通用标准的opencl,另一种是NVIDIA的cuda加速。opencl是苹果公司提出的一种通用标准,多种平台支持的标准。cuda是NVIDIA提出的并行计算平台,只有NVIDIA的显卡支持,但是比起opencl,cuda在使用上更方便,因为opencl是开放标准,封装上做的可能没有那么好,现在NVIDIA的显卡使用的多一些,所以cuda也就比较多用。
使用OpenCV的cuda必须要编译附加库的模块contrib,这个附加库中又许多核心库没有的内容,如:特征匹配,跟踪,cuda等内容,个人不太喜欢用cmake,但是还不能不用,因为cmake配置有点错误,编译的时候就会报错,编译时间长的话,到最后才报错就特别坑,尤其是cuda的编译,cuda的编译时间特别的长,主要是因为cuda存在对计算能力的兼容性的问题,默认要编译好多架构,这样会导致编译时间特别的长,我机器的显卡是 GTX1050Ti,所以计算能力属于10系列,16年后发布的10系列的显卡基本上都在5.0以上,我们日常用的机器中安装的显卡基本上都是gtx系列,NVIDIA最新发布的显卡能达到8,不过我的cuda9.2兼容只能到7.0,再高编译的时候就报错。cuda编译的时候需要注意必须提前安装cuda,否则编译也不通过,还有就是我没有安装cuda的dnn,所以编译的时候没有选择dnn,如果想要使用dnn,还要再安装cuda对应版本的dnn,不然编译仍然会报错。
另外opencv编译的时候如果不想编译出一大堆的lib文件,可以选择world选项,之后编译的时候会生成world.lib,但是有一点不太好就是,如果编译有问题要全部重新生成。
编译成功后,需要引入cuda相关的头文件,OpenCV3以后的头文件都以cuda开头,最长用的应该是
1 #include <opencv2\cudaarithm.hpp>//矩阵相关的计算 2 #include <opencv2\cudafilters.hpp>//各种滤波器
OpenCV中也为cuda图像运算提供了一种类型GpuMat,与Mat类似,同时cuda的调用封装与不同的调用也基本没有差距,只不过属于cv::cuda空间。
1 GpuMat gpu; 2 Mat mat; 3 4 gpu.upload(mat); 5 doSomething(); 6 gpu.download(mat);
GpuMat 的调用过程基本上与cuda是一样的,只不过做了一层封装,上传图像到Gpu,运算后再下载到CPU。
许多函数都进行了封装,调用起来也非常方便,当然如果CPU传输到GPU的时间比运算所要的时间都要长,那么就没必要去GPU进行运算了,因为每次上传下载都非常耗费时间,所以GPU运算未必会变快。