OpenCv已经支持多线程了吗?

7
我希望使用OpenCV来录制视频并将其作为流发送。我是一个初学者,想知道OpenCV是否会阻塞主线程还是自行分线程?
我阅读了OpenCV文档(2.4.9),但没有找到答案。
谢谢阅读。

它是阻塞的。至少所有我知道的函数都是这样。 - Micka
3个回答

6

当你调用一个函数时,OpenCV可以生成线程。然而,在控制返回到调用线程之前,所有的工作都已完成。出于许多原因,异步处理会增加相当多的复杂性。(例如:程序如何知道计算何时完成?)如果程序不需要是异步的,它还会引入一些不必要的开销。

但是,你可以使用C++11线程API自己进行异步处理,只需付出最少量的努力。


5
是的,它可能会产生线程。OpenCV可以使用多个线程并行处理不同的数据块(“并行区域”)。有关详细信息,请参见setNumThreads和附近函数。 - artm

4

OpenCV可以使用OpenMP来构建,以利用您计算机上可用的所有核心进行计算函数。它也可以使用OpenCL和CUDA来构建。此外,它还具有各种SIMD优化标志。

如果您不使用此类支持构建它,它将运行单线程。

在任一版本中,调用OpenCV函数会阻塞启动器线程,直到它计算出所有操作。即使将计算卸载到GPU上,这也是正确的。


1
尽管标题如此,我认为主要问题是“OpenCV是否会阻塞主线程”。 - Micka

0

OpenCV 的 parallel_for 操作创建多个线程来执行操作。它构建一个线程池并将工作分配给它。

线程的数量由 setNumThreads 函数决定。将其设置为零以进行串行工作。[这取决于 opencv 构建的线程库。对于某些线程库,它是 1]

注意:我曾经遇到过一些线程问题,当时我正在管理自己的线程池。


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