как получить попиксельные значения из необработанного видео YUY2 yuyv422? - PullRequest
0 голосов
/ 17 октября 2018

У меня есть видео (расширение .ravi), которое является выходом программного обеспечения ИК-камеры.Мне нужно вычислить температуру для каждого пикселя для каждого кадра в этом видео.Компания по разработке ИК-камер и программного обеспечения уже сказала мне, что они не помогут, так как такая информация покажет большую часть их ноу-хау.

Когда я воспроизводю видео, например, в mplayer, температурные поля, кажется, отображаются правильно.Таким образом, информация, которая переводится в цвет пикселя, содержит информацию о его температуре.

Моя идея состоит в том, чтобы изолировать каждый кадр в файл, найти информацию о пикселях для каждого пикселя в каждом файле.Я могу получить температуру пиксель за пикселем для отдельных кадров с помощью оригинального программного обеспечения ИК-камеры (хотя это делается по принципу «укажи и щелкни», что невозможно для каждого кадра).Затем, с информацией о пикселях на одной стороне и информацией о температуре на другой стороне (обе для первого кадра), я надеюсь связать их с помощью функции, и, надеюсь, эта функция применяется ко всем кадрам видео.

Для этого видео я получаю следующие метаданные (из FFMEPG):

Metadata:
META            : (640,480,16,312500),(0,0,0,0),0,1,80
Duration: 00:13:53.06, start: 0.000000, bitrate: 158338 kb/s
Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 640x481, 157619 kb/s, 32 fps, 32 tbr, 32 tbn, 32 tbc

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

Как получить доступ к этой информации?

Я попытался преобразовать каждый кадр в изображение (например, PNG) с помощью FFMPEG, а затем получить значение для каждого пикселя.(например, используя ImageMagick), но я получаю значения RGB.

Следуя @ VC. Один совет, я могу преобразовать каждый кадр в один файл:

ffmpeg -i original.ravi -c copy -pix_fmt yuyv422 frame%05d.bmp

(Если я использую .yuv какрасширение вместо .bmp Я получаю один файл, а не файл для каждого кадра.)

Теперь, с файлом для каждого кадра, я могу посмотреть на него с помощью ImageMagick:

convert -size 640x481 -depth 8 -sampling-factor 4:2:2 YUV:frame00001.bmp -colorspace YUV frame00001.txt

и вот как выводитсявыглядит так:

# ImageMagick pixel enumeration: 640,481,65535,yuv
0,0: (12436,26650,58361)  #3068E3  yuv(48,104,227)
1,0: (6314,29662,45762)  #1973B2  yuv(25,115,178)
2,0: (15547,25111,19123)  #3C624A  yuv(60,98,74)

Из документации я понимаю эту информацию следующим образом: первая строка, заголовок, содержит информацию о количестве пикселей (640x481) и максимальном значении для каждого поля YUV: 65535 (этоЯ предполагаю, что это опция -depth 8), затем для каждого пикселя строка: ее позиция, значения YUV в скобках, затем в качестве комментария значение RGB и еще что-то, чего я не понимаю.

Сохраняются ли отдельные кадры как файлы yuv, даже если они имеют расширение .bmp?Правильно ли я прочитал вывод ImageMagick?

1 Ответ

0 голосов
/ 18 октября 2018

(1)

"Я хотел бы, чтобы для каждого кадра видео были указаны значения яркости и цветности для каждого пикселя."

Сначала ... Получить видео в отдельные кадры с помощью FFmpeg:

ffmpeg -f rawvideo -framerate 32 -s 640x481 -pix_fmt yuyv422 -i input.yuv -c copy frame%d.yuv

При этом каждый кадр будет выводиться как отдельный YUV (, например: frame01.yuv , frame02.yuv ).Примечание: заголовок ширины или высоты изображения отсутствует, поэтому позже вы должны указывать размер изображения при использовании файла YUV.

Секунда ... Получение значений пикселей:

Я не используюImageMagick, но из быстрого исследования руководства:

convert -size 1024x768 -colorspace YUV frame01.yuv output01.txt

Выше не проверено, и, возможно, вам также понадобятся -sampling-factor 4:2:2 или даже -depth 8 в качестве параметров ввода.У вас больше опыта, чем у меня с этой программой.Может быть, даже попробуйте как:

convert -size 1024x768 -depth 8 YUV:frame01.yuv -colorspace YUV output01.txt

"... Как я могу быть уверен, что полученный мной yuyv422 ... такой же, как в оригинальном видео?"

Вы можете открыть каждый файл YUV в шестнадцатеричном редакторе, чтобы увидеть данные YUV в виде байтовых значений (или найти инструмент командной строки, который печатает двоичные данные).

Например, желтыйпиксель выглядит так:

RGB (24): [FF] [F2] [00] ... где красный = FF (255), зеленый = F2 (246), синий = 00 (0).

YUYV422(16): [CB] [13] [CB] [96] ... где Y0 = CB (203), U0 = 13 (19), Y1 = CB (203), V0 = 96 (150).

Итак, начиная с индекса 0для первого пикселя значение lum (Y) равно 203, а ChromaB (U) равно 19, пропустите один байт (, то есть: третий байт) и получите ChromaR (v) = 150. Таким образом, первый пиксель YUV равен [CB][13][96] в байтах данных YUV кадра.

Второй пиксель начинается с того третьего байта [CB], который был ранее пропущен.
См. Изображение ниже для структуры байтов YUV ...

image

...