我正在研究一个在CUDA平台上实现人脸检测算法的项目。
目前我要访问GpuMat
个实例上的元素。
我尝试了以下传统方法:
cv:Mat
进行归纳,GpuMat
没有<T>.at
方法。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
答案 0 :(得分:3)
您必须将其下载到cv::Mat
,然后使用标准方式访问它。
我认为下载它很简单:
cv::Mat mat;
sumMat->download(mat); // or something like that.
答案 1 :(得分:0)
从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
的单个像素,必须将引用实际矩阵数据(位于设备内存中)的指针传递给内核,并对该指针执行指针算法。