【问题标题】:OpenCV multithreading with Mats使用 Mats 的 OpenCV 多线程
【发布时间】:2017-09-03 03:20:57
【问题描述】:

嘿!所以我正在做一个关于 OpenCV 多线程的任务。我的问题如下。如何让我的所有线程在同一个图像(存储在 Mat 中)上工作?我知道制作副本会使它变慢,因此多线程毫无意义。另外,我想控制我使用的线程数,即使我看到了 lambda c++ 11 的介绍,我也不知道如何制作它,以便我控制线程数。

我目前有一个函数可以计算要放入图像中的每个像素,所以我在串行上运行的代码如下所示:

for(int i=0;r<MyMat.cols;i++){
    for (int j=0;j<MyMat.rows;j++){
        uchar value = (uchar) MyFunction(i,j);
        MyMat.ptr<uchar>(i)[j] = value;
    }
}

英语不是我的母语,如果我没有正确解释自己,请要求澄清。任何帮助都是好帮助!

【问题讨论】:

  • 如果您修改Mat,那么您可能需要原始Mat 的硬拷贝。对于不修改Mat的线程,可以直接使用全局变量赋值Mat
  • opencv Mat 没有什么特别之处。一个不错的功能可能是您可以在每一行的末尾添加一个填充,这可能会或可能不会帮助您获得一些不错的内存访问行为。如果您必须“修改”图像,您可能希望将结果保存在另一个 Mat 中而不是真正的修改。

标签: c++ multithreading opencv


【解决方案1】:

如果您将图像分割成水平带,每个线程可以独立地在自己的带上工作。如果每个线程没有更改超出其频带的任何图像数据,它应该可以工作。

事实上,OpenCV 已经支持这一点。 看看parallel_for_ 以及它是如何使用的。

【讨论】:

  • 谢谢!我见过parallel_for,问题是我想控制我创建的线程数,到目前为止我不知道如何使用parallel_for。实际阅读文档中的 Mandelbrot 示例。
  • 谢谢!我去查一下
  • @RodrigoAlvarado:如果这有帮助,请将答案标记为已回答 :-)
猜你喜欢
  • 2016-02-03
  • 2015-08-06
  • 1970-01-01
  • 2010-12-09
  • 2017-05-30
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
相关资源
最近更新 更多