使用 Qt 并行化 OpenCV 处理

Posted

技术标签:

【中文标题】使用 Qt 并行化 OpenCV 处理【英文标题】:Parallelize OpenCV Processing with Qt 【发布时间】:2011-05-26 02:00:37 【问题描述】:

我正在使用 Qt 和 OpenCV。我使用 QtOpenGL Widgets 并将 opencv 帧映射为 glPlane 上的纹理,这非常快并且效果很好。

现在我想知道是否可以通过使用 QThreads 进一步提高性能。 QThread 实现了映射和归约功能。因此应该可以拆分opencv帧并让多个线程处理帧。

例如:如果我的帧是 640x480 并且我有 4 个线程可用,我会将帧拆分为 640x120 大小的帧,并将一个传递给每个线程。

线程没有共享数据,因为每个线程都有自己的帧,最后我只需要附加 4 个帧或将它们复制到一个新帧中。

我的问题是,您认为这会奏效吗?它会加快处理速度,还是在其他地方存在瓶颈?

【问题讨论】:

【参考方案1】:

首先,我的直觉是:“如果它真的很快而且效果很好,那就不要改变它!”

如果你只是想玩转线程,我建议你看看QtConcurrent。我对使用QThread 与QtConcurrent 的实现之间的性能差异一无所知,但我更喜欢使用QtConcurrent::run 而不是使用线程(我没有性能关键的渲染代码)。

【讨论】:

【参考方案2】:

首先,确保不要为每一帧都创建新线程 - 构建线程的成本很高。一个轻量级的解决方案可能是使用QtConcurrent::run() 创建 N 个 QFuture。在每个期货上使用QFuture::waitForFinished 并收集结果。但是,我不相信 QFutures 是实时处理的正确解决方案。另一种方法是直接使用QThreadPool。同样,请确保不要每帧都创建池。

【讨论】:

以上是关于使用 Qt 并行化 OpenCV 处理的主要内容,如果未能解决你的问题,请参考以下文章

并行化摸索中

OpenMp实现并行化

使用JAVA CompletableFuture实现流水线化的并行处理,深度实践总结

使用多处理并行化列表项附加到 dict

QProcess, QEventLoop - 可用于并行处理

如何使用 PySpark 并行化我的文件处理程序