用于录像机的多线程

时间:2017-01-10 09:52:24

标签: c++ multithreading opencv

我正在使用GigEPRO相机,根据图像尺寸具有60fps或更高的能力。因此,60fps表示1帧/ 16ms。但是录像机功能本身消耗2-4ms。因此,我决定将图像存储在vector<Mat>中并创建一个child_thread,负责使用OpenCV中的writer函数将图像写入视频,方法是访问矢量图像并擦除存储的图像。

我对此实现的查询很少。 我可以使用vector<Mat>存储图像,还是应该创建队列? 如何将child_thread与主线程同步?

我是多线程编程的新手,因此寻找一些输入

2 个答案:

答案 0 :(得分:1)

将采集线程和编写器/记录器线程与帧内队列解耦,这是一个很好的理解。

在某些时候,输入流可能比输出写入操作更快(特别是如果您要写入磁盘等慢速设备)。 为了防止不断增长的队列(会占用PC上的所有可用内存),您可以考虑具有最大项目限制的队列。

一个选项是编写自己的类似队列的类:
1.在内部使用一个合适的容器(即std :: queue&lt;&gt;或std :: deque&lt;&gt;,因为defaule的std :: queue使用了std :: deque)
2.只暴露你需要的函数(即构造函数,推(框架),pop(),size(),...)

对于线程安全,您可以考虑使用类内部std :: mutex来保护类似队列的类方法,更好地使用std :: lock_guard&lt;&gt;。 更好的方法是使用无锁容器,更复杂,可以正确编写,但您可以在Web或github上找到一些实现。

答案 1 :(得分:1)

高fps录制的解决方案是使用MATLAB的图像采集工具箱,支持GigE和GenIcam。使用ROI作为1000x700我将达到150fps,这可以使用32GBRam的处理器和高处理速度。通常使用8GB内存和i7处理器,我可以达到50fps。此外,为了获得更好的图像质量,将曝光时间更改为1000微秒是最佳选择。在图像采集工具箱中,可以选择将数据记录在内存或磁盘中。记录内存是更好的选择,因为在将数据记录到磁盘中时停止采集后导出数据,同时写入数据。