我正在使用GigEPRO相机,根据图像尺寸具有60fps或更高的能力。因此,60fps表示1帧/ 16ms。但是录像机功能本身消耗2-4ms。因此,我决定将图像存储在vector<Mat>
中并创建一个child_thread,负责使用OpenCV中的writer
函数将图像写入视频,方法是访问矢量图像并擦除存储的图像。
我对此实现的查询很少。
我可以使用vector<Mat>
存储图像,还是应该创建队列?
如何将child_thread与主线程同步?
我是多线程编程的新手,因此寻找一些输入
答案 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微秒是最佳选择。在图像采集工具箱中,可以选择将数据记录在内存或磁盘中。记录内存是更好的选择,因为在将数据记录到磁盘中时停止采集后导出数据,同时写入数据。