OpenCV中的Mat多线程处理

3
嘿!我正在处理一个关于使用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 - ghchoi
关于opencv Mat,没有太多特别的地方。一个不错的特性是你可以在每一行的末尾添加填充,这可能有助于获得一些良好的内存访问行为。如果你必须“修改”图像,你可能希望将结果保存在另一个Mat中,而不是进行实际修改。 - Micka
1个回答

3
如果将图像分成水平条带,每个线程可以独立地处理自己的条带。如果每个线程没有修改其条带以外的任何图像数据,则应该有效。
实际上,OpenCV已经支持了这一点。请查看parallel_for_及其使用方法。parallel_for_

谢谢!我已经看到了parallel_for,问题是我想控制我创建的线程数,到目前为止我不知道如何在parallel_for中实现。实际上,我已经阅读了文档中的Mandelbrot示例。 - Rodrigo Alvarado
谢谢!我会查一下的。 - Rodrigo Alvarado
@RodrigoAlvarado:如果这个回答有帮助,请标记为已解决 :-) - Adi Shavit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接