Выдалось свободное время, ещё немного поэкспериментировал. Выяснилось, что ffmpeg может выполнять преобразование YUV422 <-> RGB, да и вообще там куча форматов поддерживается. Взял первую попавшуюся в гугле картинку (png), перевёл в yuv такой командой:
Код: Выделить всё
.\ffmpeg.exe -i .\cat.png -f rawvideo -pix_fmt yuv422p output.yuv
Дальше сконвертировал назад в RGB:
Код: Выделить всё
.\ffmpeg.exe -pixel_format yuv422p -video_size 750x750 -framerate 25 -i output.yuv newcat.png
Всё перевелось нормально, за тем исключением, что похерился альфа-канал. Вот, для сравнения оригинал и результат.
- оригинал
- yuv422 -> png
Не знаю, сохраняется ли альфа в бинарник, выяснять стало лень. Надо чем-то верифицировать этот yuv, порылся в сети, нашёл
yuvplayer, поддерживает YUV422 и можно выставить кастомное разрешение. В общем, тоже читает без проблем.
После этого решил получить то же самое в
. Попалась на глаза тема
FFMPEG scripting in LabVIEW (.NET) В архиве FFMPEG Examples v1.1.zip есть уже готовые SubVI для YUV420. Разница между форматами не слишком большая, это можно видеть в yuvplayer, переключая разные форматы. В общем, получилось вот это:
Слева я вывел "сырой" массив U16, справа - массив, преобразованный в RGB. В плеере получается то же самое, если сменить цветовую схему на 420. В общем, вывод такой, что даже в "сыром" yuv-файле присутствуют все пиксельные данные в линейном виде, т.е. преобразования нужны только для восстановления цвета. Потому даже если вы получаете 8-битную картинку 320 на 256, в ней не должно быть искажений или провалов палитры, как при пороговом преобразовании. Если такое наблюдается, значит либо где-то какая-то пост-обработка всё же выполняется, либо что-то не так с железом (неподходящие заводские настройки или аппаратный дефект). Я бы ещё проверил CL-кабель, если есть осциллограф, то можно даже
уровни сигнала замерять. У меня подобной камеры в хозяйстве нет, но есть на работе баслеровские GigE-камеры. Если будет время, проверю, в каких форматах они отдают и какая картинка приходит.
upd: посмотрел, доступны форматы Mono 8, Mono 16, Mono 12, YUV 422 Packed и YUV 422 (YUYV) Packed.
В примере Grab из пакета Vision Acquisition использован IMAQdx Grab VI, который автоматом перегоняет изображение в RGB (U32) (ну, или в то, что было выставлено в NI-MAX перед этим). Можно взять "сырой" буфер с помощью IMAQdx Get Image Data VI. Тогда приходит массив U8 размером 2 * длина * ширина изображения. Переводим в U16, затем преобразуем 1D в 2D. У меня камера ч/б, потому нет смысла даже в RGB перегонять.