【问题标题】:How to access an element on cv::gpu::GpuMat matrix using CUDA and OpenCV?如何使用 CUDA 和 OpenCV 访问 cv::gpu::GpuMat 矩阵上的元素?
【发布时间】:2012-04-23 01:33:53
【问题描述】:

我正在做一个在 CUDA 平台上实现人脸检测算法的项目。

目前我想访问GpuMat 实例上的一个元素。

我尝试了以下常规方法:

  1. 试图从cv:Mat 进行归纳,GpuMat 没有<T>.at 方法。
  2. 我已尝试使用 CV_MAT_ELEM ,但收到错误消息。

这是我在 FaceDetection.cu 文件中的代码:

        int DetectFacesGPU(cv::gpu::GpuMat * sumMat ,cv::gpu::GpuMat * qSumMat , float factor)
            {
                //
                int i = CV_MAT_ELEM(*sumMat,int ,0,0); 
                // 

我收到一个错误

Error   29  error : expression must have class type C:\Users\Shahar\Dropbox\OpenCV2.3\OpenCV2.3\FaceDetectionLatest\FaceDetectionCuda\FaceDetectionLatest\FaceDetection.cu  139

【问题讨论】:

  • 许多做 OpenCV GPU 的人使用 ArrayFire 来填补缺失的功能。
  • 你能给我举个例子吗
  • 是否有任何优雅的方式访问 gpu::mat 上的像素?谢谢回答

标签: opencv matrix cuda gpu


【解决方案1】:

您必须将其下载到cv::Mat,然后以标准方式访问它。

我认为下载它很简单:

cv::Mat mat;
sumMat->download(mat); // or something like that. 

【讨论】:

  • 不,我想查看gpu平台上的值。例如在 Cuda 代码期间
  • 不,你不能。但请不要因此而责怪我。也许您只能下载一个子矩阵,以使其更快,但无论如何这只是一个调试技巧。您不应将此方法用作算法的基础。
  • 哈哈 ....@vasile 我不怪你...当你的第一语言不是英语时就会发生这种情况。
【解决方案2】:

CV_MAT_ELEM的定义,CV_MAT_ELEM(*sumMat, int, 0, 0);扩展为:

*(int*)CV_MAT_ELEM_PTR_FAST(*sumMat, 0, 0, 4));

进而扩展为:

*(int*)(assert ( 0 < (*sumMat).rows && 0 < (*sumMat).cols ),
               (*sumMat).data.ptr + (size_t)(*sumMat).step*0 + 4*0);

假设你的DetectFacesGPU函数被定义为一个设备代码,上面的语句是错误的,因为你不能在设备代码中取消引用sumMat。通过这样做,您正在从设备代码访问主机内存。您必须小心,因为 GpuMat 类本身 是在主机内存中分配的。 只有实际的矩阵数据在设备内存中分配。

所以GpuMat 类本身通常不会传递给内核。要在内核中访问GpuMat 的单个像素,您必须将引用实际矩阵数据(位于设备内存中)的指针传递给内核并对该指针进行指针运算。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    相关资源
    最近更新 更多