Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using gpu::GpuMat in OpenCV C++

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...)

like image 987
Poko Avatar asked Feb 15 '26 08:02

Poko


1 Answers

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.
like image 88
jet47 Avatar answered Feb 16 '26 23:02

jet47