【问题标题】:How to fill each cv::Mat Column with a different value in OpenCV C++?如何在 OpenCV C++ 中用不同的值填充每个 cv::Mat 列?
【发布时间】:2016-02-03 02:13:48
【问题描述】:

我正在研究 OpenCV GPU。 我想知道,我们可以直接在 C++ 代码中访问GpuMat 元素吗? 对这件事知之甚少是不可能的。 我正在将数据从 GPU 内存下载到 CPU 内存,然后使用“at”运算符访问元素。

但我需要这样的东西: 对于 2x3 矩阵: 元素应填写如下:

Mat abc(0 , 0) = 1;
Mat abc(0, 1) = 2;
Mat abc (0 , 2) = 3;
Mat abc(1 , 0) = 1;
Mat abc(1, 1) = 2;
Mat abc (1 , 2) = 3;

即, 用不同的值填充每一列。 在 for 循环中使用“at”运算符非常耗时。 是否有任何 API 或其他方式可以在更短的时间内完成。

【问题讨论】:

  • Using gpu::Mat in Opencv C++ 的可能重复项
  • @Aurelius 你能解释一下你的评论吗...
  • 链接的问题还询问如何操作cv::GpuMat 中的数据。那里的答案建议setTo(),这正是您想要的。
  • 对。你应该能够创建一个投资回报率并填充它。
  • at<>() 很慢。在docs.opencv.org/doc/tutorials/core/how_to_scan_images/… 使用高效的图像扫描技术。它发现它比 at() 快 5 倍以上。我认为@Aurelius 有正确的方法。

标签: c++ opencv


【解决方案1】:

GpuMat 提供same functionality 的大部分内容为cv::Mat。您可以使用col() 创建一个子矩阵并使用setTo() 填充数据:

cv::gpu::GpuMat gm(3,3,CV_8UC1);
for (int i = 0; i < gm.cols; ++i)
{
    auto column = gm.col(i);
    auto val = cv::Scalar(i + 1);    // This value is just to reflect your example.
    column.setTo(val);
}

【讨论】:

  • 谢谢.. 我不知道 col() 。
  • 我会试试这个并检查性能,如果性能下降(与 CPU 相比)......我将需要其他方法来做到这一点。
  • 没有for循环就没有办法做到这一点,与for循环一样,执行时间将取决于矩阵中的列数。列数越多,执行时间越长
  • @user2100866 在不手动设置索引的情况下,我没有看到避免循环的明显方法。为什么要避免循环?此外,this question 在考虑性能时可能会有所帮助。
  • 我发布了一个标题为“cpu-gpu-performance-comparision”的问题,其中,我发现使用 C 风格 Open Cv API 和 GPU 在 for 循环中实现相同的操作(加法) API 会导致性能差异,其中 GPU 性能会下降,并且在增加 for 循环的迭代次数时会进一步下降。目前我正在将基于 CPU 的代码移植到 GPU 中以提高性能。
猜你喜欢
  • 1970-01-01
  • 2022-06-25
  • 1970-01-01
  • 2021-10-07
  • 2014-01-28
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多