使用多线程处理和保存图像

Posted

技术标签:

【中文标题】使用多线程处理和保存图像【英文标题】:IMage elaboration and saving using Multithreading 【发布时间】:2015-11-13 19:29:41 【问题描述】:

我用 C++ 编写了一个软件,用于处理来自相机的视频流,使用 openCV 库。 我想在处理视频帧时保存它,以便有可能使用与输入完全相同的视频多次离线运行代码。 我正在考虑使用生产者/消费者模式来使用多线程。

我的想法是让一个生产者(帧采集器)和两个消费者(一个用于处理图像,另一个用于将帧保存在文件中(作为视频))。

我没有多线程编程的经验,所以我在网上搜索了一些教程。 我找到的所有教程都是关于一个生产者和一个消费者的,但我需要的略有不同:我需要一个生产者向两个消费者发送相同的图像,并且在两个消费者完成工作后,继续下一个框架。关键是生产者将有一个存储帧的队列,而消费者都需要从同一个队列中读取一次相同的元素。

你有什么建议吗? 您认为我选择的模式符合我的需要吗?

谢谢。

【问题讨论】:

将图像“发送” 给 2 个消费者是什么意思?当然,您只需将它放在共享内存中并让他们访问它,而不是在任何地方发送它。我看不出发送两次的意义——让每个人都按自己的意愿访问它,然后每个人都可以指示他们何时完成,这告诉你可以覆盖它。还可以考虑使用几帧的缓冲区,这样您就可以容忍磁盘写入速度的微小变化。 【参考方案1】:

生产者-消费者的作品。在您的情况下,生产者可以“生产”两次,首先将其放入处理队列,然后将第二个副本放入保存队列。

【讨论】:

但这需要生产者使用两个不同的互斥体,每个队列一个?对吗? 是的,最好使用 2 个互斥锁。您需要确保任何共享数据都受到保护,不会被并发访问。使用 2 个互斥锁(而不仅仅是一个)可确保两个消费者彼此独立。

以上是关于使用多线程处理和保存图像的主要内容,如果未能解决你的问题,请参考以下文章

c#中利用system.timers多线程做图像处理,图像保存时提示“GDI+ 中发生一般性错误”,如何解决?

对多线程的通俗理解

图像处理的多线程计算

图像处理的多线程计算

多线程的主要用处是啥?

从单线程到多线程图像处理