2

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

目前我要访问GpuMat实例上的元素。

我尝试了以下常规方法:

  1. 试图从中进行归纳cv:MatGpuMat没有<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
4

2 回答 2

3

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

我认为下载它很简单:

cv::Mat mat;
sumMat->download(mat); // or something like that. 
于 2012-04-10T21:50:36.023 回答
0

从 的定义CV_MAT_ELEMCV_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,您必须将引用实际矩阵数据(位于设备内存中)的指针传递给内核并对该指针进行指针运算。

于 2017-05-28T13:13:52.733 回答