【问题标题】:Using gpu::GpuMat in OpenCV C++在 OpenCV C++ 中使用 gpu::GpuMat
【发布时间】:2013-07-14 19:21:45
【问题描述】:

我想知道如何修改gpu::GpuMat。事实上,我想知道是否可以像cv::Mat 一样使用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(必须测试...)

【问题讨论】:

  • 我真的不明白这是一个 CUDA 编程问题。也许您可以从问题中删除 CUDA 标签?
  • 我想使用 Opencv over Cuda 提供的 gpu::Mat ...
  • 是的,但是您的代码或问题中的任何内容实际上都与 CUDA 无关,只有 OpenCV 类切线地引用了隐藏在其中某处的 CUDA 的抽象。按照相同的逻辑,您应该用“windows”或“linux”标记您的问题,因为您的代码也在操作系统的顶部运行 OpenCV....

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


【解决方案1】:

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

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

【讨论】:

  • 谢谢!这就是我的想法……:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 2012-04-23
  • 2018-09-26
  • 1970-01-01
  • 2019-11-06
  • 2011-10-21
  • 2020-01-13
相关资源
最近更新 更多