Как прочитать значения пикселей видео? - PullRequest
4 голосов
/ 28 апреля 2010

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

Теперь задача состоит в обработке видео (покадрово), как я могу это сделать?Как я смогу читать заголовки непрерывных потоков кадров изображений в видеоклипе?Или же, как, например, формат mpeg также будет иметь универсальный заголовок, после прочтения которого я могу получить информацию обо всем видео, а после заголовка все данные представляют собой только пиксели.

Iнадеюсь, что смогу передать.

У кого-нибудь есть опыт обработки видео?

Любые книги или ссылки на учебники будут очень полезны.

Ответы [ 3 ]

4 голосов
/ 28 апреля 2010

Видеопоток, как и MPEG, состоит из ряда кадров, зависящих (очевидно) от его длительности и частоты кадров. Чтобы прочитать пиксель, вы должны начать с того, что называется внутрикадровым кадром, который не зависит от предыдущего кадра в потоке. Любой последующий кадр - это кадр, который временно зависит от предыдущего кадра, поэтому для получения его пикселя необходимо декодировать поток из Intra в нужный кадр.
Отметим, что, как правило, внутренний кадр периодически вставляется, чтобы дать декодеру способ синхронизации с потоком. Это очень полезно в контексте, где могут возникать ошибки.
То, что вы хотите сделать, не легкая работа. Вы должны использовать декодер MPEG, а затем изменить кадр перед его воспроизведением, если вы хотите выполнить постобработку, например, фильтр или другой.
Я предлагаю вам изучить кодирование видео, и вы можете найти много материала об этом, начиная со стандартного MPEG.

2 голосов
/ 28 апреля 2010

Я бы порекомендовал посмотреть FFMpeg . У него есть утилита командной строки, которая может захватывать кадры из фильма и выгружать их в изображение, подобное JPG. После этого вы можете изменить существующий читатель для обработки файлов JPG (просто используйте что-то вроде libjpeg для декодирования JPG в буфер необработанных пикселей).

Кроме того, вы можете использовать API-интерфейсы FFMpeg (C, Python и т. Д.), А также делать программный захват кадров и смотреть на пиксели при перемещении по видео. Форматы видео сложны, поэтому, если вы не хотите разбираться во всех различных кодеках, вам может понадобиться библиотека, чтобы выполнить декодирование в необработанный пиксельный буфер.

1 голос
/ 28 апреля 2010

MPEG 1/2/4 видео гораздо сложнее обрабатывать, чем растровые изображения, потому что они сжаты. С растровыми данными у вас есть фактические значения цвета, сохраненные непосредственно в файл. В этом случае в формате MPEG или JPEG информация о цвете проходит через преобразования чисел перед записью в файл. К ним относятся

  • RGB -> YUV 420P (цветность с частичной выборкой)
  • Дискретное косинусное преобразование
  • Взвешенное квантование
  • зигзагообразный порядок
  • дифференциальное кодирование
  • кодирование переменной длины (по типу Хаффмана)

Все это означает, что не существует простого способа анализа пиксельных данных из файла. Вы должны либо изучить каждую мелкую деталь стандарта и написать свой собственный декодер, либо использовать некоторую библиотеку декодирования видео, такую ​​как ffmpeg, чтобы сделать работу за вас. ffmpeg может конвертировать ваше видео в неподвижные изображения ( см. ответы на этот недавний вопрос ). Также вы можете напрямую взаимодействовать с библиотеками ffmpeg (libavformat и libavcodec). См. Ответы на этот вопрос для хороших уроков.

...