Upd.
Автором написана программа
PGMania для автоматизации описанных в статье операций. PGMania использует библиотеки FFMPeg и ImageMagick для построения видео из последовательности изображений и поддержки различных форматов.
Тем не менее, статья не теряет своей актуальности, т.к. позволяет вникнуть в суть встающих при решении подобных задач вопросов.
____________________________________________________________________
Ситуация такая. Есть приличная ч/б видео-камера Point Grey Flea3. Камера 16-ти разрядная, скоростная, чувствительная, с наличием многих режимов и опций, и по всем статьям подходящая для планетной съемки.
Но есть один существенный недостаток - ее родная программа FlyCap2, делающая захват видео с камеры выдает на компьютер 8 бит, а не 16. Это обстоятельство сводит достоинства самой камеры на нет и загоняет ее в один ряд с более дешевыми астро-камерами.
Известно, что данная камера и FlyCap2 умеют писать на компьютер серии отдельных кадров в 12/16 бит. Но программы обработки астро-фото работают, в основном, с видеороликами в .avi или с фото в .ser форматах. Таким образом, встала задача преобразовать серию снимков 16 бит .pgm в видео-ролик 16 бит .avi и скормить его Autostakkert'у и WinJupos.
Есть такая жутко мощная штука, как ffmpg. Это набор С++ библиотек для работы c видео, фото, звуком. На ее базе построены многие известные ЛА приложения. Наткнулся на статью с описанием некоторых ее функций и попытался поработать с ней напрямую.
Если у вас стоит Windows, то скачиваем ffmpeg отсюда и распаковываем.
Например, сюда D:\Distrib\ffmpeg-20131118-git-260fc0d-win32-static. Дальше запускаем D:\Distrib\ffmpeg-20131118-git-260fc0d-win32-static\bin\ffmpeg.exe.
ffmpeg стартует в фоновом режиме.
Затем в обработчике команд (cmd) набираем команду
ffmpeg -f image2 -i YourPhotoFile_%04d.pgm YourVideoFile.mpg
Если, при этом, вы получили сообщение, что система не знает, что такое ffmpeg, положите копию файла ffmpeg.exe в ту же папку, что и обрабатываемые снимки. Это поможет.
После этого в cmd с помощью команд "d:"(у вас может быть другой диск) и "cd имя_папки" последовательно добираемся до папки, где лежат снимки с камеры. У меня, например, в папке оказался такой список снимков Юпитера, снятых в IR канале:
fc2_SAVE_ir_2013-11-18-072200-0000
.....
fc2_SAVE_ir_2013-11-18-072200-0407, т.е. в папке лежат 408 снимков в ч/б, 16 bit.
В обработчике команд (cmd) набираем команду:
ffmpeg -f image2 -i PhotoFile_%04d.pgm VideoFile.mpg
, где вместо PhotoFile и VideoFile надо подставить реальные имена фото и желаемое имя для видео файлов. Команда склеивает все файлы с расширением .pgm, вида PhotoFile_0001.pgm ... PhotoFile_9999.pgm, находящиеся в выбранной папке в один видео файл с именем VideoFile.mpg. Шаблон %04d указывает, что порядковый номер файла четырехзначный. Можно использовать любой формат изображений - tiff, jpeg, png и т.д. В моем случае использовался .pgm.
Если файлы такого вида: PhotoFile1.jpg...PhotoFileN.jpg, то команда будет такая:
ffmpeg -f image2 -i PhotoFile%d.jpg VideoFile.mpg
Используемые мной команды:
ffmpeg -f image2 -i fc2_SAVE_ir_2013-11-18-072200-%04d.pgm VideoFile.mpg
Еще одна команда. Тут 30 задает желаемый fps.
ffmpeg -r 30 -y -i "fc2_SAVE_ir_2013-11-18-072200-%04d.pgm" VideoFile.mpg
С этой командой получили 25 fps, хотя хотели 30. Если у вас несколько роликов, собрать их в один также можно командой ffmpg. Если ролики в одинаковых форматах с одинаковыми параметрами:
ffmpeg -i "concat:input1.mpg|input2.mpg|input3.mpg" -c copy output.mpg
Еще один формат команды, дающий такие же результаты:
ffmpeg -r 30 -i "fc2_SAVE_ir_2013-11-18-072200-%04d.pgm" -y -r 30 "VideoFile.mpg",
где 30 - желаемый fps
Попутно, нашел утилиту Images to Video, которая является оберткой для ffmpeg. Программа имеет простой человеческий интерфейс и без каких-либо затыков собрала за пару минут полноценный ролик .wmv из всех кадров, находящихся в исходной папке. Дальше отправляем полученный файл на переплавку, т.е. конвертируем в .avi формат. Дальше обрабатываем, как обычно.
Однако, все описанные выше варианты работали с 8 бит и с компрессией. Задача же заключалась в том, чтобы 16-битные .pgm засунуть в 16 же битный видеоролик и желательно без потери качества (lossless).
Дальнейшие поиски привели к дискуссии в интернете. Опыты с предложенными там решениями выдали уже более вменяемые результаты, с использованием кодека ffv1. Например, применялись такие команды:
ffmpeg -f image2 -pix_fmt gray -i fc2_SAVE_ir_2013-11-18-072200-%04d.pgm -an -vcodec ffv1 movie.mov (выдал 16 бит .mov) , .mov это хорошо, но мало. Идем дальше.
ffmpeg -f image2 -pix_fmt gray -i fc2_SAVE_ir_2013-11-18-072200-%04d.pgm -an -vcodec ffv1 movie.mkv (выдал 16 бит .avi) , это тоже хорошо, идем еще дальше.
ffmpeg -f image2 -pix_fmt gray -i fc2_SAVE_ir_2013-11-18-072200-%04d.pgm -an -vcodec ffv1 movie.avi (выдал 16 бит .avi)
Отработали команды вполне неплохо, выдав ролики в 16 бит.
Однако, чтобы их воспроизвести, пришлось установить декомпрессор XMedia Recode для ffv1. Эта программа, кроме того, является замечательным и серьезным универсальным конвертором.
На данном этапе нам нужно открыть ролики в VirtualDub. Для этого воспользуемся кодеком huffYUV, color mode выберем Planar 16bpp. Добавим job и выполним конверсию. После этого с радостью убеждаемся, что VirtualDub замечательно читает полученный после конвертации файл.
Чудесно и никакого надувательства. Однако, 16 бит Gray мы уже потеряли.
Как и чем посмотреть полученный 16bit Gray ролик? Найти медиа проигрыватель, способный воспроизвести видео в 16 bit оказалось проблематичным. Условно 16 битный ролик можно посмотреть в том же XMedia Recode (с перекодированием при просмотре и в маленьком масштабе) или в WindowsPlayer от питерской команды iTVA (не путать с Windows Media Player от Microsoft). Он воспроизводит без особых проблем (кроме скорости).
Но тут на помощь приходит тот же ffmpeg и ffplay.
Во избежание недоразумений, имеет смысл скопировать исходный ролик, с тем, чтобы не испортить его(такие шансы есть) в процессе экспериментов.
Кроме того, нужно положить ffplay.exe в ту же папку, что и просматриваемый ролик. Тут нам надо выбрать, в каком формате выводить изображение
Команды ffplay:
ffplay L0_2013-11-18-073506.avi
проигрывает оригинал в исходном качестве, с паузами на обдумывание.
В следующих вариантах задается кодек для потока
ffmpeg -i L0_2013-11-18-073506.avi -f avi - | ffplay -
проигрывает ровно, но с изрядно урезанным качеством, в 25fps.
ffmpeg -i L0_2013-11-18-073506.avi -f matroska - | ffplay -
проигрывает оригинал в исходном качестве, тоже с тормозами. Возможно, на мощном компьютере все будет ровно и гладко. Я проверял на стареньком ноутбуке.
На данном этапе развития человечества невозможно работать с роликами 16 битном формате в Autostakkert и WinJupos. Однако, можно перевести ролик в формат .ser и вполне успешно обработать его. Как в Autostakkert, так и в WinJupos. Например, PIPP преобразует 16bpp .avi в формат .ser 8/16 gray .
Итак, если камера имеет разрядность 10/12/16 бит, но выдает видео поток в 8 бит, предложенный способ позволяет относительно простыми средствами выжать из нее максимум и пустить в обработку кадры без потери разрядности и качества.
А результат хранить в полноценном 16 bit видео ролике .