Using gpu::GpuMat in OpenCV C++

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

Solution

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

- Set all matrix pixels to the same value (`setTo` method).

- Fill data on CPU using `cv::Mat` and then upload it to `GpuMat`.

- Implement your own CUDA kernel and fill `GpuMat` in it.

Problem

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

Original source