2013-07-16 114 views
2

我想知道如何修改gpu::GpuMat。事實上,我想知道是否有可能使用gpu::GpuMat,如cv::Mat在OpenCV C++中使用gpu :: GpuMat

我願做這樣的事情:

cv::namedWindow("Result"); 
    cv::Mat src_host = cv::imread("lena.jpg", CV_LOAD_IMAGE_GRAYSCALE); 
    cv::gpu::GpuMat dst, src; 
    src.upload(src_host); 


    for (unsigned int y = 0; y < src.rows; y++){ 
     for (unsigned int x = 0; x < src.cols; x++){ 
      src.at<uchar>(y,x) = 0; 
     } 
    } 

    cv::Mat result_host; 
    dst.download(result_host); 
    cv::imshow("Result", result_host); 
    cv::waitKey(); 
} 
catch(const cv::Exception& ex) 
{ 
    std::cout << "Error: " << ex.what() << std::endl; 
} 
return 0; 

這似乎是不可能的。有人知道另一種方法嗎? 每次我想做點什麼時,我是否必須將我的gpu::GpuMat下載到cv::Mat? 在此先感謝

編輯:我大概可以使用gpu::PtrStepSz(一定要考...)

+0

我真的不知道這是一個CUDA編程問題。也許你可以從問題中刪除CUDA標籤? – talonmies

+0

我想使用gpu :: Mat,它是由Opencv通過Cuda提供的... – Poko

+0

是的,但是在您的代碼或問題中沒有任何事情與CUDA有關,只有OpenCV類切入指代CUDA的抽象某處。通過相同的邏輯,你應該用「windows」或「linux」來標記你的問題,因爲你的代碼在操作系統的頂部運行OpenCV以及...... – talonmies

回答

9

GpuMat在GPU內存分配。您不能從CPU代碼修改它。您可以

  1. 將所有矩陣像素設置爲相同的值(方法setTo)。
  2. 使用cv::Mat在CPU上填寫數據,然後將其上傳到GpuMat
  3. 實現您自己的CUDA內核並在其中填充GpuMat
+0

謝謝!這就是我在想...:/ – Poko