OpenCv 是不是已经线程化?

Posted

技术标签:

【中文标题】OpenCv 是不是已经线程化?【英文标题】:Is OpenCv already threaded?OpenCv 是否已经线程化? 【发布时间】:2014-10-10 19:05:44 【问题描述】:

我想使用OpenCV 来录制视频并将其作为流发送。我是初学者,我需要知道 OpenCV 是阻塞主线程还是它本身是线程化的?

我阅读了 OpenCV 文档 (2.4.9),但找不到任何答案。

感谢阅读。

【问题讨论】:

它正在阻塞。至少我知道的所有功能。 【参考方案1】:

OpenCV 可以在调用函数时产生线程。但是,所有工作都在控制权返回给调用线程之前完成。由于多种原因,异步处理会增加相当多的复杂性。 (例如,考虑一下:您的程序如何知道计算何时完成?)如果程序不需要异步,它也会引入一些不希望的开销。

不过,您可以使用C++11's threading API 自己进行异步处理,而且只需很少的工作量。

【讨论】:

是的,它可能会产生线程。 OpenCV 可以使用多个线程并行处理不同的数据块(“并行区域”)。有关详细信息,请参阅setNumThreads 和附近的功能。【参考方案2】:

可以使用 OpenMP 支持构建 OpenCV,以使计算功能使用您机器上的所有可用内核。它也可以使用 OpenCL 和 CUDA 构建。此外,它还有各种 SIMD 优化标志。

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

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

【讨论】:

尽管标题如此,但我认为主要问题是“OpenCV 是否阻塞了主线程”【参考方案3】:

OpenCV 的 parallel_for 操作会创建多个线程进行操作。它构建一个线程池并在其中分配工作。

线程数由 setNumThreads 函数决定。将其设置为零以进行串行工作。 [这根据构建 opencv 的线程库而改变。有些人是 1]

注意:我在管理自己的线程池时遇到了一些线程问题。

【讨论】:

以上是关于OpenCv 是不是已经线程化?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用opencv获取已经灰度化二值化的一张黑色图片中的一个亮点的具体像素坐标

OpenCV:来自 VideoWriter 的写入是不是应该在独立线程中运行?

使用opencv,对一个已经二值化的身份证图像,怎么样将身份证号码所在的图像切割出来?

OpenCV中聚类方法的并行化

用 C++ 将 OpenCV 帧写入磁盘:单线程写入速度是不是受磁盘吞吐量以外的任何限制?

Python OpenCV 错误:当前线程不是对象的线程