Захватывать высокоскоростную веб-камеру и обрабатывать кадры с помощью потоков? - PullRequest
0 голосов
/ 10 сентября 2011

У меня есть веб-камера PS3 Eye, способная выдавать кадры со скоростью до 120 раз в секунду в зависимости от разрешения.

Мне нужно выполнить некоторую обработку каждого кадра, и в настоящее время это занимает довольно много времени.,Веб-камера настроена на 60 кадров в секунду, что оставляет около 16 мс времени обработки на кадр, но из-за узкого места в обработке я могу извлекать только около 30 кадров в секунду.

За кадром покажет циклизвлекает данные растрового изображения из камеры, устанавливает свойство растрового изображения и уведомляет, что был получен новый кадр, поэтому изображения не будут складываться, если обработка занимает слишком много времени.

Я думаю, что я должен быть в состояниикаким-то образом использовать многопоточность для ускорения обработки.

Возможно, вот так

  1. Полученный кадр
  2. Поток 1 начинает обработку
  3. Полученный кадр
  4. Поток 1 занят
  5. Поток 2 начинает обработку
  6. Поток 1 завершил обработку
  7. Кадр получен
  8. Поток 1 начинает обработку
  9. Поток 2 завершил обработку
  10. И т. Д.

Как вы думаете, многопоточность, возможно, с помощью библиотеки Task Parallel улучшит производительность?

Спасибо взаранее!

Ответы [ 2 ]

1 голос
/ 10 сентября 2011

Многопоточность должна помочь, и модель является проблемой производителя-потребителя

Википедия - http://en.wikipedia.org/wiki/Producer-consumer_problem

Я делаю то же самое в своем исследовании, когда я читаю с высокоскоростных камер (~ 360 кадров в секунду), и мне нужно быстро обрабатывать каждый кадр. У меня есть один поток настройки, чтобы просто прочитать с камеры, а затем добавить в очередь (производитель). Когда изображения добавляются, счетный семафор увеличивается. Затем у меня есть пара потребителей (обычно три), которые затем извлекают изображения из очереди, обрабатывают данные и обновляют модель.

Википедия - http://en.wikipedia.org/wiki/Semaphore_(programming)

1 голос
/ 10 сентября 2011

Ваша идея должна работать.Теоретически теперь вы должны иметь возможность «удвоить время» и получить желаемые 60FPS.

Одна проблема:

  1. Кадр получен
  2. Поток 1 начинает обработку
  3. Кадр получен
  4. Поток 1 занят
  5. Поток 2 начинает обработку
  6. Кадр получен

К сожалению, теперь что, обазанятый.Поэтому вам может понадобиться третий поток, действующий как «сервер», который выбирает изображения, очереди и передает их вам «рабочим» потокам.

...