2012-04-10 446 views
2

我正在研究一個在CUDA平臺上實現人臉檢測算法的項目。CUDA | OpenCV | GPU模塊|如何訪問cv :: gpu :: GpuMat上的元素

當前我想訪問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 

任何幫助將是非常appricated

小號

+0

很多人在使用OpenCV GPU使用ArrayFire來填補缺失功能的空白。 – arrayfire 2012-04-10 22:22:24

+0

你能給我舉個例子嗎? – TripleS 2012-04-11 01:25:08

+0

有什麼elegent方式訪問gpu :: mat上的像素嗎?謝謝你的回答 – TripleS 2012-04-13 10:04:31

回答

3

您必須將其下載到cv::Mat,然後以標準方式訪問它。

我想下載它很簡單,只要:

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

不,我想檢查一下gpu平臺上的值。 E.g在Cuda代碼 – TripleS 2012-04-11 01:24:11

+3

不,您不能。但請不要爲此責怪我。也許你只能下載一個子矩陣,使其更快,但無論如何只是一個調試技巧。您不應該將此方法用作算法的基礎。 – Sam 2012-04-11 05:27:08

+0

haha​​h .... @vasile我不怪你......那是當你的第一語言不是英語時發生的事情。 – TripleS 2012-04-13 11:31:09

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的各個像素,必須將指向實際矩陣數據(位於設備內存中)的指針傳遞給內核,並對該指針進行指針運算。