Если нельзя, но очень хочется, то нужно обязательно и ничего в мире не стоит того, чтобы делать из этого проблему!


Интересна Java? Кликай по ссылке и изучай!
Если тебе полезно что-то из того, чем я делюсь в своем блоге - можешь поделиться своими деньгами со мной.
с пожеланием
столько времени читатели провели на блоге - 
сейчас онлайн - 

суббота, 2 ноября 2013 г.

Делаем видео панораму

На простых фото панорамах (в том числе сферических) я уже сгрыз все локти.


И вот сутра собирая материал для очередной, пришла идея - а что, если смонтировать видео панораму? Но как? А ХЗ, но точно знаю одно - без сырцов никаких панорам не будет, потому снял 5 видеороликов секунд по 30.

Снимал точно так же как и для фото-панорам - кадры должны перекрываться % на 30, чтобы программа могла найти на них общие точки и смерджить. После поспешил домой, дабы поэксериментировать.

Первым делом полез в гугл и нашел там статью, в которой это самое "КАК?" расписано по самое не могу.  Суть вкратце в том, чтобы сделать видеопанораму надо разобрать ее на серию кадров (каждый кадр, как отдельная фотка), склеить первые кадры из всех видеороликов и создать на основе этого проекта темплейт, по которому прогнать все остальные кадры. После полученные панорамы конвернуть в видео с исходной частотой.  Ну что, цель видна! Вперед.

Исходный материалом будет 5 видеороликов продолжительностью около 20 секунд. Снимал на Nikon, потому формат MOV. Я точно помню, что VirtualDub Mod умеет разбивать видео на кадры и чтобы его подружить с MOV форматом я воспользовался этим советом. Итого у меня получилось как-то так


Каждый видеофайл (avs) по очереди я перегнал в серию bmp изображений и разместил их в отдельных папках. Поехали!

Открываю первый файл в VirtualDub Mod и выбираю на нем интервал, который мне больше всего нравится. Ползунком (1) выбирается положения начала, после чего кликается кнопка (2), затем выбирается конец фрагмента и нажимается кнопавка (3).


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

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


После того как я определился с диапазоном я удаляю все, что было до него и после него. Делается это так. Ctrl-X, Ctrl-A, Del, Ctrl-V.

Кстати, на картинке выше можно увидеть насколько перекрываются разные ракурсы.

После того, как в окно VirtualDub Mod перетащил первый аvs файл, выбрал меню File -> Save image sequence... (1) после в диалоге добавил к расширению файла суффикс _N (2), где N - номер видеоролика по порядку. Это надо сделать - так как формат, который кушает следующая программа - [номер кадра]_[номер камеры].[расширение]. Дальше указал папку (3) (для удобства я пока все кадры одной камеры/ракурса сохраняю в отдельную папку). Выбрал bmp (4) как формат без потерь (осторожно в результате на винте будет очень много места скушано). Поставил галку (5), что значит что я сейчас не хочу процессить эту задачу, а добавлю ее в список ожидания. Аминь! (6) Затем перетягиваю в окно программы следующий avs файл и проделываю то же самое, только теперь N=2 и результирующая папка тоже другая.


В результате появилось 5 новых папок, по одной на каждый видеоролик. В каждый папке большое число изображений формата bmp (и каждая весит около 2Gb на 15 секунд видео).


После того, как я опроцессил все видяшки, я удаляю лишнее. Например в первом ролике у меня 16 секунд видео и 390 кадров. Значит в остальных папках можно смело удалять все файлы с номером от 391 и выше.  

Следующие грабли, которые я попытаюсь исправить - это то что я снимал с рук, а не со штатива. Дело в том, что с рук камера немного ходит туда сюда, а качания камеры не синхронны - это сильно испортит результирующую картинку. Значит вывод №1 - снимать сырцы только со штатива. Если это сделать, то следующий этап можно пропустить.

А выравнивать кадры будем вот так. Понадобится нам программа PTGui в нее загружаем все 390 кадров из первой папки (путем выделения и перетаскивание файлов в окно программы). Есть один нюанс, не позволяющий нам перетаскивать сразу все файлы - их порядок нарушится внутри программы. Потому перетаскиваем вначале файлы с номерами 0-9, потом 10-99 а потом 100-999 и так далее 1000-9999 (для продолжительного видео).

При перетаскивании выскочит диалоговое окно (просто в bmp раскадровке нет информации о линзах фотоаппарата, а потому надо ему помочь) - нажимаем Normal Lens (1) дальше в самой программе жмем Align Images (2) и ждем, пока обработаются все фотки серии.


Так мы заставим программу найти общие точки на каждом кадре и выровнять их тем самым устранив качание камеры в руках.


Может случиться глюк и кадры выравняются как-то не так. Потому после зайдем в Panorama eitor (1) и убедимся, что все кадры наложились один на другой (2).

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

Дальше нам нужно указать границы по которым программа обрежет фотки в результате. Делается это путем перемещения границы на то место, где она должна быть (1-4). Тут шахматная доска - это то что будет залито черным цветом - его нам в результате не надо.


Так же очень важно, что границу надо опускать немного ниже (5) видимой границы кадра, потому как за ней может быть другой кадр, который чуть ниже размещен (из за того же качания камеры при съемке). Проверить это можно просто прокликивая разные кадры на всем диапазоне (1-390). Если в каком-то видно что в пределах границы появилась шахматка - границу надо опустить....

Вот например у меня на 87 кадре (1) такое случилось (2) и я опустил чуть ниже шахматки желтую границу (3). Самое обидное тут то, что чем дольше снимаешь с рук - тем сильнее уползает камера.



Далее на вкладке Project Assistant (1) нажимаем Advenced (2)



После  на вкладке Create Panorama (1) выбираем размер панорамы максимлаьный (2), указываем, что хотим в результате получить все слои (3) указываем папку, в которую поместим результат (4) и создаем панораму (5).



После в папке ...\1\pan\ появится множество jpeg файлов. Теперь можно удалять исходные bmp - они нам больше не понадобятся.

Ту же процедуру стоит проделать и с другими bmp из других ракурсов.  

Теперь можно заняться поклейкой кадров ракурсов в серию панорам. Подробней об этом.

Для начала в каждой папке с jpeg кадрами ракурса я сделал несложное переименовывание всех файлов в общий формат. Делается это с помощью простого bat-ничка (текстовый файл с расширением bat) с содержимым
rename *.jpg ?????_1.jpg
Это у нас будет первый ракурс. bat для второго ракурса будет
rename *.jpg ?????_2.jpg
И так далее... После выполнения bat файла все файлы переименуются как-то так и порядок их будет строго в порядке увеличения номера кадра.

 
Вслед за этим сливаем все кадры-ракурсы в одну папку.


И первую серию 00000_1 ... 00000_5 отправляем в PT Gui. Там выбираем Normal Lens (1), кликаем Ok (2) и клеим панорамку (3)


Быть может понадобится нам немного выровнять ее, сшить вручную или подкорректировать то, что предложил автомат - это ручная работа. В результате нам надо добиться того, чтобы панорама была максимально ровной. Так же в Panorama Editor стоит обрезать края, как мы это делали раньше. 


Дальше нам стоит отправиться на последнюю вкладку PT Gui и там настроить все как на картинке


Можем собрать панораму и посмотреть как получилось, но это вовсе не обязательно. Нам надо сохранить проект как


Имя стоит выбрать template.pts

После этого потребуется джарник, который я написал для этих целей (есть возможность воспользоваться встроенным в PTGui батчером, но у меня были с ним проблемы и я написал свой). Конечно же для работы с ним понадобится установить java.
Команда выполняется так 'java -jar batch-builder.jar [1] [2] [3] [4] [5]', где:
[1] - Номер первого кадра панорамы (обычно 0)
[2] - Номер последнего кадра панорамы
[3] - Номер первой камеры/ракурса (обычно 1). Все последующие рассчитываются в зависимости от количества кадров в одной панораме.
[4] - (опционально) Имя файла сохраненного проекта pts (по умолчанию 'template.pts')
[5] - (опционально) Формат имен файлов кадров (по умолчанию '%image_%camera.bmp',
                    где %image = задает позицию номера кадра, а %camera - позицию номера ракурса')
[6] - (опционально) задает количество символов в части имени %image.
                    Если параметр равен 0 или не указан, то сичтается что исходные изображения будут называться
                        1_1.bmp, 2_1.bmp, 3_1.bmp ... 10_1.bmp ... 100_1.bmp
                    Если параметр равен, например 6, то ожидается работа с исходными изображениями в формате
                        000001_1.bmp, 00002_1.bmp, 000003_1.bmp ... 000010_1.bmp ... 000100_1.bmp
Итого выполняем команду
D:\pan>java -jar batch-builder.jar 0 390 1 template.pts %image_%camera.jpg 5
Процессинг кадров с номерами [0-2] от для камер начиная с номера 1,
файл шаблона - 'template.pts', формат кадров '%image_%camera.jpg', для номеров кадров включено дополнение до длинны 5.
Обработка началась!
Количество камер в темплейте - 5
Обработка прошла успешно!
В результате в исходной папке появятся так же и файлики от 0_panorama.pts до 390_panorama.pts, открыв любой из которых можно посмотреть склеенную панораму для определенного кадра.

Теперь открываем PTGui, в нем в меню Tools->Batch sticher


И дальше перетягиваем в новооткрытый диалог все тепленькие pts файлы. Тут же начнется сборка панорам.


 Через несколько минут (в зависимости от количества кадров и размера исходных изображений) все будет готово. В исходной папке появятся файлы с 0_panorama.jpg и до 390_panorama.jpg.


Теперь их можно склеить в видео используя уже знакомый нам VirtualDubMod. Для этого выбираем File->Open video file


Далее выбираем первый по порядку файл 0_panorama.jpg (1) и выделяем галочку (2) и открываем (3).


Все файлы загрузятся последовательно. Уменьшим изображение, чтобы оно помещелось на экране - правой кнопкой мыши (1) а потом выбрать (2) процент по-меньше. После запустим плеер и просмотрим результат (3).


 Если VirtualDub крешнулся как у меня - не расстраиваемся. Открываем его с начала и загружаем все рисунки. После можно просмотреть кадр за кадром пользуясь кнопками Влево/Вправо...
 
Теперь нам осталось выбрать кодек и сжать видео. Идем в Video-Compression


Выбираем какой-то подходящий кодек. 


Выбираем очень большой битрейт



Иногда бывает так, что кодек накладывает на исходное видео ограничение (например ширина и высота кадра кратна 4) - в таком случае надо кропнуть размер кадра.

Но наш кодек не накладывает никаких ограничений, а потому мы кроппинг можем скипнуть. На всякий опишу как он делается - меню Video-> Filters


Потом добавить NullTransform фильтр


Дальше выделить его (1) и кликнуть Cropping (2), а на нем обрезать сверху и слева на столько пикселей, чтобы результирующий размер (1) соответствовал требованиям кодека.


Дальше нам надо выйти из этих диалогов. И зайти в File-Save as...


Выбрать имя файла и сохранить видео.

Конечно что-то может пойти не так. А потому надо немного потраблшутить. С вопросами пиши в комментах. Если с кодеком получается лажа (большой файл, скушать не может) значит надо попробовать сохранить видео в несжатом виде. При этом размер будет просто огроменный, но гарантированно будет. После видео можно ужать другими видеоредакторами.



А чтобы еще раз закрепить материал, я выложу тут видяшку того, как это делается вместе с архивом со всеми промежуточными файлами...

Комментариев нет:

Отправить комментарий