【问题标题】:How to get descriptor from gpuHog?如何从 gpuHog 获取描述符?
【发布时间】:2015-01-28 03:32:41
【问题描述】:

我使用的CPU版本如下。

vector<float> descriptors;
cv::HOGDescriptor hog(cv::Size(24,32),cv::Size(12,12),cv::Size(4,4),cv::Size(6,6),6);
hog.compute(img, descriptors,cv::Size(8,8), cv::Size(0,0));

我的问题是如何使用 GPU 获取“描述符”?

我尝试了以下代码。 (不工作)

cv::gpu::GpuMat gpu_value, gpu_descriptors;
cv::gpu::HOGDescriptor hog_gpu(Size(24,32),Size(12,12),Size(4,4),Size(6,6),6);
gpu_value.upload(img);
hog_gpu.getDescriptors(gpu_value,cv::Size(8,8),gpu_descriptors);

如何从“gpu_descriptors”获取“描述符”?

谁能帮我解决这个问题?非常感谢!

【问题讨论】:

    标签: opencv feature-descriptor


    【解决方案1】:

    你可以使用gpu::GpuMatmemeber函数download()将gpu_descriptors下载到CPU内存中,如下:

    Mat cpu_descriptors; 
    gpu_descriptors.download(cpu_descriptors);
    

    但是,描述符在 GPU 上的存储方式可能与在 CPU 上的存储方式不同,即 cpu_descriptors 可能与上面代码中计算的 descriptors 不完全相同。不过你可以试一试。

    编辑 对于gpu::HOGDescriptor,似乎没有以vector&lt;float&gt; 格式将描述符下载到CPU 内存的方法。作为旁注,我知道您可以使用它的成员函数下载gpu::SURF_GPU 特征检测器的描述符

    void downloadDescriptors(const GpuMat& descriptorsGPU,
        vector<float>& descriptors);
    

    这正是你想要的。但是,不幸的是,由于某种原因,cv::gpu::HOGDescriptor 不存在此功能。您可以尝试弄清楚数据是如何存储在vector&lt;float&gt; 类型的描述符中,然后尝试从Mat 转换为vector&lt;float&gt; 格式。

    【讨论】:

    • 嗨,Alex,是否可以将 cpu_descriptors 转换为向量?
    • cv::gpu::HOGDescriptor hog_gpu(Size(24,32),Size(12,12),Size(4,4),Size(6,6),6);这里似乎有些问题。你能帮忙吗?谢谢
    • 程序崩溃@cv::gpu::HOGDescriptor hog_gpu(Size(24,32),Size(12,12),Size(4,4),Size(6,6),6 );当我使用 cv::gpu::HOGDescriptor hog_gpu 时它工作正常。不知道问题所在。我使用 x64 平台
    • @user3203629 在构造函数的参数中:块步长必须是单元格大小的倍数。请参阅documentation。在您的情况下,Size(4,4) 不是Size(6,6) 的倍数。此外,nbins – 箱数。目前每个单元仅支持 9 个 bin。在您的情况下,nbins = 6。总之,请确保根据文档设置参数
    • 非常有帮助!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多