Using gpu::GpuMat in OpenCV C++

 

Questions


I would like to know how can I modify a gpu::GpuMat. In fact I would like to know if it is possible to use a gpu::GpuMat like a cv::Mat.

I would like to do something like that:

    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;

It seems to be not possible. Does someone know an alternative ?
Do I have to download my gpu::GpuMat to a cv::Mat each time I want to make something ?
Thanks in advance

Edit: I could probably use gpu::PtrStepSz (have to test…)

 

 

————————————————-

Answer

GpuMat is allocated in GPU memory. You can’t modify it from CPU code. You can

  1. Set all matrix pixels to the same value (setTo method).
  2. Fill data on CPU using cv::Mat and then upload it to GpuMat.
  3. Implement your own CUDA kernel and fill GpuMat in it.

c++,cuda,gpu,image-processing,opencv

Facebook Comments

Post a comment