今天就来说说关于使用opencv 使用cuda加速的版本吧,来做一点记录,免的以后忘记了
下载opnecv4.10板本和contrib4.10版本,使用cmke编译,这里注意 opencv选项中,扩展的路劲,以及勾选 WITH_CUDA 这个选项,不然编译之后的DLL,没有cuda版本的,
大约是这些个样子的,这里附上我编译之后的lib include 文件.的百度云链接,可以直接下载
链接: https://pan.baidu.com/s/1To-HtiZl0dJvnSxGEcclsw 提取码: kvas
貌似有点大.
在将lib 以及 .h等头文件配置好项目中后,我们直接使用,下面是一些效果图,加速效果明显,上面的时间单位i是ms,速度很快
//这是一段获取图像平均数值的代码.下面详细介绍.
double getAvg_gpu(cv::Mat &img)
{
//创建gpumat结构,这个数据结构是专门在PGU 上做的运算,
cv::cuda::GpuMat gray;
cv::cuda::GpuMat source;
cv::Mat dst;
long controlnubers = 0;
//判断通道数目
if (img.channels() == 3)
{
//将cv::mat结构的数据,放入GpuMat结构中,其实就是cuda中的 cudaMalloc 和 cudaMemcpy 的结合,//但//是,这里的gpumat结构,在生命周期结束后,会自动释放gpu内存,而我们使用cuda加速的时候,却需要自动释放
source.upload(img);
//这个是cv里面自动加速的算法,我们直接主动调用.这里有个细节,CV_BGR2GRAY 注意,这里BGR的顺序,否则,提取一个像素的RGB的时候,其R和B是反的.
cv::cuda::cvtColor(source, gray,CV_BGR2GRAY);
//这里将处理过之后的数据,从gpuMat结构中,转化为 Mat结构.
gray.download(dst);
//这里使用了mat中的一个算法,求取均值
Scalar scalar = cv::mean(dst);
qDebug() << "channels: " << img.channels();
//这个返回的数值,就是我们获取到的图像的平均数值.:这里的这个均值,经过我测试,是采用的0.299*R + 0.587*g + 0.144*B = gray 这个算法,累加平均之后的数值.这里就不演示了.
return scalar.val[0];
}
else if(img.channels() == 1)
{
Scalar scalar = cv::mean(dst);
return scalar.val[0];
}
return 0;
}
//基本上的套路就是这个
//测试一下代码.
void main()
{
cv::Mat gray_r = imread("image\\group_7.bmp");
if (gray_r.data == nullptr)
{
qDebug() << "read image failed";
return ;
}
double avgNumber = getAvg_gpu(gray_r );
qDebug() << QStringLiteral("gpu获取的图像均值: %1 ").arg(avgNumber);
}
这个经过加速,我测试的时间是0.05ms ,够快吧.