在OpenCV C ++中使用gpu :: GpuMat

时间:2013-07-16 14:35:42

标签: c++ opencv image-processing cuda gpu

我想知道如何修改gpu::GpuMat。事实上,我想知道是否可以像gpu::GpuMat那样使用cv::Mat

我想做那样的事情:

    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(必须测试......)

1 个答案:

答案 0 :(得分:9)

GpuMat在GPU内存中分配。您无法从CPU代码修改它。你可以

  1. 将所有矩阵像素设置为相同的值(setTo方法)。
  2. 使用cv::Mat在CPU上填充数据,然后将其上传到GpuMat
  3. 实施您自己的CUDA内核并在其中填入GpuMat