Opencv的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);

猜你喜欢

转载自blog.csdn.net/weixin_38907560/article/details/81186024