多线程 OpenCV 程序
Posted
技术标签:
【中文标题】多线程 OpenCV 程序【英文标题】:Multithreading an OpenCV Program 【发布时间】:2013-07-03 12:42:26 【问题描述】:感谢您阅读我的帖子。
我对一个 opencv 应用程序进行多线程处理时遇到了问题,我希望你们能帮助我解决这个问题。
我的目标是从视频序列的中间保存 400 帧(JPEG 格式)以供进一步检查。
我的代码在单线程中运行良好,但多线程导致了很多问题,所以我想知道我的理念是否全错了。
就我应该做什么的示意图而言,我最好:
选项 1:以某种方式同时访问单个视频文件(或制作副本?),然后让各个线程逐帧循环播放视频,当每个帧在预定限制之间时保存它?例如。线程 1 保存帧 50 到 100,线程 2 保存帧 101 到 150 等等。
选项2:打开文件一次,逐帧循环,然后将单个帧传递给一系列独特的线程以执行保存操作。例如。第 1 帧传递给线程 1 进行保存,第 2 帧传递给线程 2 进行保存,第 3 帧传递给线程 1,第 4 帧传递给线程 2 等等。
选项 3:其他一些缓冲区/线程安排,这是一个比上面更好的主意!
我正在使用带有标准库的 Visual C++。
非常感谢您在这方面的帮助,
干杯,凯
【问题讨论】:
我会先尝试选项 1,这似乎很明智,没有线程必须共享数据,这是简单的情况(实际上选项 2 可能不必共享数据)。但是选项 1 似乎更有效,现在建议是“尝试两个选项,看看哪个表现更好;-) 使用尽可能多的线程作为你拥有的核心。人们希望 OpenCV 有一种方法来指定你想要开始的帧范围使用,因此每个线程不必从第 0 帧开始。 嗨,Chris O,感谢您的回复,选项 1 是我迄今为止尝试做的,但由于错误,我想知道是否有可能做到这一点!线程通常可以访问同一个文件吗?如何找出我可以拥有多少个线程?干杯,凯 【参考方案1】:选项 1 是我迄今为止尝试做的,但由于错误,我想知道是否有可能做到这一点!线程通常可以访问同一个文件吗?如何知道我可以拥有多少个线程?
当然,不同的线程可以访问同一个文件,但支持库是否支持这确实是个问题。要读取视频流,您可以使用 OpenCV 或 ffmpeg(例如,您可以在同一个应用程序中使用两者,使用 ffmpeg 进行读取,使用 OpenCV 进行处理)。没有看过文档,所以我在这里猜测:lib 应该允许同一文件上的多个阅读器。
要找出核心数:
SYSTEM_INFO sysinfo;
GetSystemInfo( &sysinfo );
numCPU = sysinfo.dwNumberOfProcessors;
来自this post。您可以创建一个线程/内核作为起点,然后根据您的性能需求和实际测试更改数量。
【讨论】:
以上是关于多线程 OpenCV 程序的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV 多线程 (Windows/.NET) 从视频捕获延迟几秒钟
多线程中的 OpenCV CascadeClassifier C++ 接口