使用线程捕获高速网络摄像头和处理帧?

时间:2011-09-10 13:45:53

标签: c# multithreading image-processing webcam task-parallel-library

我有一个PS3 Eye网络摄像头,能够根据分辨率提供高达120次的帧数。

我需要对每个帧进行一些处理,目前这需要花费很多时间。 网络摄像头设置为60 fps,每帧处理时间约为16 ms,但由于处理瓶颈,我每秒只能检索大约30帧。

在幕后,while循环从摄像头检索位图数据,并设置位图属性,并通知已检索到新帧,因此如果处理时间过长,图像将不会叠加。

我想我应该能够以某种方式使用线程来使处理“更快”。

也许就像这样

  1. 收到框架
  2. 线程1开始处理
  3. 收到框架
  4. 主题1正忙
  5. 线程2开始处理
  6. 主题1已完成处理
  7. 收到框架
  8. 线程1开始处理
  9. 线程2已完成处理
  10. 你们认为使用任务并行库可能会提高性能吗?

    提前致谢!

2 个答案:

答案 0 :(得分:1)

你的想法应该有效。从理论上讲,你现在应该能够“加倍”并达到理想的60FPS。

一个问题:

  1. 收到框架
  2. 线程1开始处理
  3. 收到框架
  4. 主题1正忙
  5. 线程2开始处理
  6. 收到框架
  7. 哎呀,现在是什么,两个都很忙。因此,您可能希望将第3个线程充当“服务器”,它可以获取图像,队列并将它们提供给您“工作”线程。

答案 1 :(得分:1)

线程应该有帮助,模型是生产者 - 消费者问题

维基百科 - http://en.wikipedia.org/wiki/Producer-consumer_problem

我在研究中做的与我从高速摄像机(~360 fps)读取时完全相同,需要快速处理每一帧。我有一个线程设置只是从相机读取,然后填充到队列(生产者)。随着图像的添加,计数信号量会增加。然后我有几个消费者(通常是三个)然后从队列中提取图像,处理数据和更新模型。

维基百科 - http://en.wikipedia.org/wiki/Semaphore_(programming