Рекомендации по попиксельному анализу телевизионного (ТВ) видео в реальном времени

[Примечание: это переписанный предыдущий вопрос, который был сочтен неуместным и закрыт.]

Мне нужно сделать некоторый анализ телевизионного (ТВ) видео на уровне пикселей. Точная природа этого анализа не имеет значения, но в основном он включает просмотр каждого пикселя каждого кадра телевизионного видео, начиная с транспортного потока MPEG-2. Хост-платформой будут многопроцессорные 64-разрядные Linux-машины серверного класса.

Мне нужна библиотека, которая может обрабатывать декодирование транспортного потока и предоставлять мне данные изображения в режиме реального времени. OpenCV и ffmpeg — две библиотеки, которые я рассматриваю для этой работы. OpenCV привлекателен, потому что я слышал, что у него есть простые в использовании API и богатая поддержка анализа изображений, но у меня нет опыта его использования. Я использовал ffmpeg в прошлом для извлечения данных видеокадра из файлов для анализа, но ему не хватает поддержки анализа изображений (хотя IPP Intel может дополнить).

В дополнение к общим рекомендациям по подходам к этой проблеме (исключая собственно анализ изображения) у меня есть несколько более конкретных вопросов, которые помогут мне начать работу:

  1. Используются ли ffmpeg или OpenCV в промышленности в качестве основы для анализа видео в реальном времени, или есть что-то еще, на что мне следует обратить внимание?
  2. Может ли OpenCV декодировать видеокадры в режиме реального времени, оставляя при этом достаточно ресурсов ЦП для выполнения нетривиального анализа изображений, в том числе в режиме реального времени?
  3. Достаточно ли использовать ffpmeg для декодирования транспортного потока MPEG-2, или предпочтительнее просто использовать библиотеку декодирования MPEG-2 напрямую (и если да, то какую)?
  4. Существуют ли определенные форматы пикселей для выходных кадров, которые ffmpeg или OpenCV особенно эффективны для создания (например, RGB, YUV или YUV422 и т. д.)?

person Randall Cook    schedule 05.12.2011    source источник
comment
Многие вопросы, связанные с производительностью, которые вы задаете, зависят исключительно от используемого вами оборудования.   -  person karlphillip    schedule 06.12.2011
comment
@karlphillip Я понимаю, что выбор платформы повлияет на производительность, но разве это не повлияет на все параметры библиотеки в равной степени? Если нет, и вы можете поговорить о том, как выбор платформы принесет пользу одной библиотеке больше, чем другой, пожалуйста, поделитесь. Оборудование еще не куплено, поэтому эта информация ценна.   -  person Randall Cook    schedule 06.12.2011
comment
Я провел анализ кадра веб-камеры в реальном времени с помощью opencv, используя оболочку С++. Он циклически просматривал каждый пиксель и проверял цвет, это было довольно быстро, потому что я мог запускать другие приложения, такие как Opera и приложение 3D-просмотра. Работа на линуксе.   -  person a sandwhich    schedule 06.12.2011
comment
@ Рэндалл Не обязательно. Например, OpenCV интенсивно использует IPP Intel, что означает, что он получит больше преимуществ от архитектуры Intel, чем другие библиотеки, которые вы могли бы использовать. :)   -  person karlphillip    schedule 06.12.2011


Ответы (2)


1.
Я определенно рекомендую OpenCV для анализа изображений "в реальном времени". Я предполагаю, что в режиме реального времени вы имеете в виду способность поддерживать частоту кадров телевизора (например, NTSC (29,97 кадров в секунду) или PAL (25 кадров в секунду)). Конечно, как упоминалось в комментариях, это, безусловно, зависит от имеющегося у вас оборудования, а также от размера изображения SD (480p) по сравнению с HD (720p или 1080p). У FFmpeg, безусловно, есть свои особенности, но вам будет сложно найти лучшую бесплатную альтернативу. Его мощность и гибкость впечатляют; Я уверен, что это одна из причин, по которой разработчики OpenCV решили использовать его в качестве серверной части для декодирования/кодирования видео с помощью OpenCV.

2.
Я не видел проблем с высокой задержкой при использовании OpenCV для декодирования. Какую задержку может иметь ваша система? Если вам нужно повысить производительность, рассмотрите возможность использования отдельных потоков для захвата/декодирования и анализа изображений. Поскольку вы упомянули о наличии многопроцессорных систем, это должно более эффективно использовать ваши возможности обработки. Я определенно рекомендую использовать новейшую архитектуру Intel Core-i7 (или, возможно, эквивалент Xeon), так как это даст вам наилучшую производительность, доступную на сегодняшний день.

Я использовал OpenCV на нескольких встроенных системах, поэтому мне хорошо знакомо ваше стремление к максимальной производительности. Я много раз обнаруживал, что нет необходимости обрабатывать полнокадровое изображение (особенно при попытке определить маски). Я настоятельно рекомендую уменьшать разрешение изображений, если у вас возникают трудности с обработкой полученных видеопотоков. Иногда это может мгновенно дать вам ускорение в 4-8 раз (в зависимости от вашего коэффициента понижения дискретизации). Что касается производительности, я определенно рекомендую использовать IPP. Поскольку OpenCV изначально был проектом Intel, IPP и OpenCV очень хорошо сочетаются друг с другом.

Наконец, поскольку обработка изображений является одной из тех «поразительно параллельных» проблемных областей, не забывайте о возможности использования графических процессоров в качестве аппаратного ускорителя для ваших задач, если это необходимо. В последнее время OpenCV проделал большую работу в этой области, поэтому при необходимости у вас должны быть эти инструменты.

3.
Я думаю, что FFmpeg будет хорошей отправной точкой; большинство альтернатив, о которых я могу думать (Handbrake, mencoder и т. д.), как правило, используют ffmpeg в качестве бэкэнда, но похоже, что вы, вероятно, могли бы создать свой собственный с IPP Video Coding, если хотите.

4.
Внутреннее представление цветов в OpenCV — это BGR, если вы не используете что-то вроде cvtColor, чтобы преобразовать его. Если вы хотите увидеть список форматов пикселей, поддерживаемых FFmpeg, вы можете запустить

ffmpeg -pix_fmts 

чтобы увидеть, что он может вводить и выводить.

person mevatron    schedule 06.12.2011
comment
Действительно полезные идеи, @mevatron. Большое спасибо. - person Randall Cook; 07.12.2011

Только по 4 вопросу:

видеопотоки кодируются в формате 422: YUV, YUV422, YCbCr и т.д. Преобразование их в BGR и обратно (для перекодирования) отнимает много времени. Поэтому, если вы сможете написать свои алгоритмы для работы в YUV, вы получите мгновенный прирост производительности.

Примечание 1. Несмотря на то, что OpenCV изначально поддерживает изображения BGR, вы можете настроить его на обработку YUV с некоторой осторожностью и знаниями о его внутреннем устройстве.

Например, если вы хотите обнаружить некоторых людей в видео, просто возьмите верхнюю половину декодированного видеобуфера (она содержит представление изображения в градациях серого) и обработайте его.

Примечание 2. Если вы хотите получить доступ к изображению YUV в opencv, вы должны использовать API ffmpeg непосредственно в своем приложении. OpenCV принудительно конвертирует YUV в BGR в своем API VideoCapture.

person Sam    schedule 06.12.2011