Opencv的GPU操作汇总(一)

本文详细介绍如何使用OpenCV的GpuMat对象进行GPU加速的图像处理,包括数据上传、下载,以及使用GPU函数进行图像转换和行人检测等高级应用。

参考链接http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/gpu/gpu-basics-similarity/gpu-basics-similarity.html#gpubasicssimilarity

Mat对象仅仅存储在内存或者CPU缓存中。为了得到一个GPU能直接访问的opencv 矩阵你必须使用GPU对象 GpuMat 。它的工作方式类似于2维 Mat,唯一的限制是你不能直接引用GPU函数。(因为它们本质上是完全不同的代码,不能混合引用)。要传输*Mat*对象到*GPU*上并创建GpuMat时需要调用上传函数,在回传时,可以使用简单的重载赋值操作符或者调用下载函数。

Mat I1;         // 内存对象,可以用imread来创建
gpu::GpuMat gI; // GPU 矩阵 - 现在为空
gI1.upload(I1); //将内存数据上传到显存中

I1 = gI1;       //回传, gI1.download(I1) 也可以
记住:一旦你的数据被传到GPU显存中,你就只能调用GPU函数来操作,大部分gpu函数名字与原来CPU名字保持一致,不同的是他们只接收 GpuMat 输入。可以在: 在线文档中找到一些说明,或者查阅OpenCV参考手册。因为大量的时间都耗费在传输数据到显存这样的步骤了,大量的计算时间被消耗在内存分配和传输上,GPU的高计算能力根本发挥不出来,我们可以利用 gpu::Stream 来进行异步传输,从而节约一些时间.

官网GPU文档:https://docs.opencv.org/2.4/modules/gpu/doc/gpu.html

注意:GPU并不能对图片的各种通道都能进行有效的处理。 GPU只接受通道数为一或四的图片,且数值类型为char或float。GPU不接受double类型的图片数据,否则会有异常抛出。对于三通道的图片数据,要么在图片上再加一个通道变为四通道(但这样会比较消耗GPU内存不推荐);或者,将图片按通道划分成多个单通道图片依次处理。若对于某些函数,图片中元素的实际位置不影响处理,那么比较好的处理办法是将图片直接转为单通道。

利用opencv gpu进行行人检测部分c++代码 如下:

    Mat src=frame; // 内存对象,可以用imread来创建
    cv::gpu::GpuMat Image_Src,Image_Dst;// GPU 矩阵 - 现在为空
    Image_Src.upload(src);//将内存数据上传到显存中
    cv::gpu::cvtColor(Image_Src,Image_Dst,CV_BGR2GRAY);//转换成单通道
    vector<Rect> found, found_filtered;//矩形框数组
 

   cv::gpu::HOGDescriptor myHOG;  //设置HOGDescriptor的检测子
  myHOG.setSVMDetector(myDetector);

    myHOG.detectMultiScale(Image_Dst, found);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值