Ekspozzer — создание панорамы из видео, усреднение видеопотока

Привет, Хабрахабр! 06394d7a7d438830a3707893012f1ac9.jpgСразу скажу: ничего феноменального в статье нет. Эта статья посвящена разработанной «на коленке» программе по созданию панорам из видео и временному усреднению видеопотока (кадров). Программа также может быть использована как виртуальная slit-камера. Статья будет интересна всем тем, кто увлекается обработкой видео и изображений, а так же гик-артом. Весьма простая программа — весьма интересный результат. В конце статьи ссылка на скачивание. Осторожно, трафик! Я заметил, что хороший и, главное, востребованный софт рождается не просто так, а из возникающих необходимостей решить ту или иную задачу. Не знаю как у других, а у меня постоянно так и происходит. И эта история — не исключение.544817880a41f393af84a4c84e6a9a7a.jpgОднажды на одном развесёлом графическом форуме у меня случайно завязался спор с одним чувачком, который утверждал примерно следующее: «Невозможно получить изображение пустой Красной Площади днём». Само собой, утверждение дико спорное: да, людей там дофига днём, но можно же всех попросить удалиться. Теоретически это возможно. У простого смертного, конечно, ничего не получится, однако, если вы — какой-нибудь Утин, то, очень постаравшись и позвонив кому надо, вы сможете организовать подобное. Да и что значит «изображение» пустой Красной Площади? Изображение — не фотография, изображение пустой Красной Площади я могу и на бумажке от руки нарисовать. В общем, за давностью лет всех деталей спора не припомню, но он был дико жаркий и мы, буквоеды чёртовы, пришли к такому уточнённому утверждению (примерно): «Из-за огромного количества людей на Красной Площади невозможно, прибегнув только к фото- и видеотехнике, получить в светлое время суток в тёплый туристический сезон (например, лето) фотореалистичное изображение (фотографию) Красной Площади без единого человека на ней с ракурса стоящего в полный рост человека, будучи простым человеком, не имеющим рычагов влияния на правительство». Ну и уточнение! Буквально, юридическое. Теперь всё стало на свои места.

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

Если вы хоть раз в жизни держали в руках фотоаппарат, а, тем более, делали снимки, то, наверное, знаете что такое экспозиция. Если совсем просто (для людей, снимающих в режиме «авто») — это продолжительность времени снятия кадра. Наверняка у вас не раз получались «смазанные» фото в движении. Вот! Это как раз экспозиция неправильно была настроена: была слишком большая. А если вдруг фото слишком тёмное получилось, то, скорей всего, экспозиция была слишком мала. Это я совсем уж детским языком рассказываю, чтоб всем было понятно: не касаюсь сейчас настроек диафрагмы и прочих тонкостей съёмки. Так вот, именно подумав об экспозиции мне пришла в голову идея решения этой задачи-спора.

Я подумал: что, если делать очень-очень-очень-оооочень долгую (огромная экспозиция) фотографию Красной Площади, но при сильно-сильно-сильно-сиииильно закрытой диафрагме (чтобы не было пересвета). Ведь тогда люди, ходившие в кадре, просто смажутся, а постоянные детали (строения, Кремль, площадь) останутся на месте. Да! Это ключ к решению. Надо бы как-то попробовать сделать это. Но как? У меня ведь нет возможности попасть на Красную Площадь. Не только ради эксперимента, но вообще, не говоря уже про «ради эксперимента». Ладно, для проверки подойдёт любая другая площадь, это не проблема. Проблема в том, что мой фотоаппарат Canon 550D, который я покупал миллион лет назад, может делать снимки с максимальной экспозицией в 30 секунд, а это очень мало для эксперимента. Покупать новый фотоаппарат ради эксперимента я тоже не могу. Нужна экспозиция реально длинная, где-то минут 30. Для чего? Чтобы повысить шанс того, что люди, находящиеся на площади, точно поменяют свою позицию и уйдут с тех мест, где находились в начале кадра. Грубо говоря, за 30 минут в каждую точку кадра должно попасть больше площади, чем людей. Я стал думать как же малой кровью решить проблему фотографирования?

fd5571142e59a7f30557ca2235c6ccf0.jpgНо мы не лыком шиты! Ведь у нас есть в руках мощнейшее средство, доступное немногим — программирование! Я решил: можно создать «виртуальный» фотоаппарат, который бы просто фотографировал экран с любой произвольной выдержкой. Знаете все эти программы для записи с экрана: SnagIt, BandiCam, FRAPS… только она записывала бы не один кадр (фото) или последовательность кадров (видео), а накапливала бы информацию (как при длинной экспозиции, что, по сути, и является экспозицией, только электронной), и в конце записи бы усредняла полученную информацию. Тогда, если на экране просто воспроизводить запись с камеры с площади, то это и будет требуемым снимком! Ура! Проблема решена… теоретически. Осталось только создать нужный софт и найти видео с неподвижной камеры, которая бы пол часа снимала площадь.

Хорошо, что запросы к программе пустяковые, и я легко реализовал требуемое за вечер.

eae3c7a0ccd3f91b639415fd03075f45.jpgС видео тоже не возникло вопросов, так как оных сущий миллиард. Подходят любые мало-мальски хорошие записи с web-камер или камер наблюдения, так как они преимущественно закреплены и на протяжении ролика не двигаются.

Эксперимент 1. Итак, начались эксперименты. Перед вами time-lapse видеозапись с Красной Площади. Но не спешите удивляться, если не видите на видео знакомые места. Красная Площадь в мире не одна (как и Санкт-Петербург и другие до боли знакомые названия), их порядка двадцати. Представленная на видео Красная Площадь находится возле Универсистета Вашингтона. Это очень людное место, являющееся достопримечательностью Университета и даже города. На площади постоянно находятся большое количество студентов, туристов, путешественников, абитуриентов, преподавателей и просто прохожих. Кстати, интересный факт: наша Красная Площадь «красная» потому, что слово «красная» в древности означало «красивая» (а сама площадь изначально строилась белая, из белого кирпича), а Красная Площадь возле Университета Вашингтона «красная» именно потому, что сделана из красноватого камня.

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

Ну, долой лирические отступления и иронии. Вот что получилось после усреднения Красной Площади:[embedded content]Видео длится всего 17 секунд, но, так как это time lapse, то фактически на видеозаписи прошедшего времени гораздо больше, чем 17 секунд. Может, 5 минут, может 15.

a117daaa609055ee10ebea20805e51ff.png bb379f8daa0200b52822d46e1df8df69.jpg Как видно из результата, на фото остались только очень долго сидящие в одном и том же месте на протяжении всего ролика люди. Некоторые из них встают и уходят, и получаются так называемые «призраки». В целом, в результате получаем почти то, что надо.Сравните теперь сколько человек на видео и сколько на фото. А сколько бы я мучался в фотошопе, вырезая людей и ища кадры, на которых в вырезанных фрагментах людей нет, чтобы вставить эти фрагменты в пустые части, и, к тому же, вставка получилась бы рваной, так как от кадра к кадру даже фоновое освещение меняется из-за теней облаков, погрешности записи и так далее. А мой ekspozzer сделал это всего за 17 секунд; получилось плавненько и без особого труда. Круто? Круто! И это только начало! Эксперимент 2. Вернёмся же к нашей Красной Площади. Я так и не нашёл достаточно хорошее и длинное видео, снятое с самой площади с помощью неподвижной камеры. Даже time lapse: там вообще ребята всё время наровят плавненько подвигать камеру. Нашёл только вот такое видео:

[embedded content]Обратите внимание на огромное количество машин на Большом Каменном Мосту.

a117daaa609055ee10ebea20805e51ff.png 8693feacf79f9932774455018681f353.jpg Получилось очень приятно и гладенько, несмотря на пляшущие тени от облаков.И куда девались машины после усреднения? Правильно: исчезли. Зацените какая чистенькая картинка получилась. Ну разве можно такой кадр днём поймать? Конечно, у любого метода есть погрешности. Так и у моего: нет-нет, да и останутся кое-где «призраки» машин или людей. На самом деле матемаика тут довольно простая. Если в видео из 100 кадров человек встречается в 5 кадрах, то он будет призрачен на 100 — 5 = 95 процентов. То есть 95 процентов информации будет получено с площади, а 5 — с человека. При такой пропорции его практически не видно. А так как люди и машины вообще постоянно движутся, то процент и того меньше! Просто шоколад! Эксперимент 3. Идём дальше, берём самую густозаполненную площадь в мире — Нью-Йоркскую Таймс Сквер:

[embedded content]Здесь всё буквально кишит людьми и машинами.

a117daaa609055ee10ebea20805e51ff.png 818634c52e5b33c518a51db118241d58.jpg А на выходе получили только стоящую одиноко полицейскую тачку…Эксперимент 4.… и ещё кучу призрачных разводов на улице слева. Ну что ж, это и есть неидеальность метода. Ещё:

[embedded content]Видео длится всего 16 секунд.

a117daaa609055ee10ebea20805e51ff.png ca27925de9932a17003cdb028aa8efb7.jpg Следовательно, и результат будет хуже! Эксперимент 5.[embedded content]Оживлённая Уолл-Стрит.

a117daaa609055ee10ebea20805e51ff.png 4c659cee7bac8340aa39a6b39a873849.jpg Результат впечатляет. Чисто! Значит, почти все движутся и мало стоят на месте.Тут всё ясно: чем короче экспозиция и медленней движутся объекты, тем больше будут выражены призраки. И наоборот: чем длиннее экспозиция и быстрее движутся объекты, тем лучше будет виден фон. В таком случае идеальны длинные time lapse видео, снятые неподвижной камерой. Что ж, таких роликов превеликая тыщща.

Эксперимент 6. Начинаем смотреть другие результаты. Вот видео с камеры наружнего наблюдения за перекрёстком, на котором происходит ДТП:

[embedded content]Усредялось с 20 по 40 секунду, всего 20 секунд.

a117daaa609055ee10ebea20805e51ff.png 7438cd7c913ee6ae242bd6c51e78516a.jpg Неплохой чистенький перекрёсточек с призраком белой машины.Эксперимент 7. А вот как раз тот самый идеальный экземпляр: длинное time lapse видео, запись с людной улицы в Арнсберге, Германия:

[embedded content]Обратите внимание как колышатся флаги на ветру.

a117daaa609055ee10ebea20805e51ff.png 7823e24a2d7f6cd5bfef142a5e756e8c.jpg В результате они колышатся и на усреднённом фото. Людей наблюдаю едва-едва.Эксперимент 8. Ну и куда ж без Эйфелевой башни!

[embedded content]Этот time lapse длится почти сутки! Идеальный вариант, но как поведёт себя усреднение при переходе с дня в ночь и наоборот?

a117daaa609055ee10ebea20805e51ff.png dfaaa4c1a36045d4d383bcf31e7f5c8a.jpg Получилось очень даже сносно и загадочно. Какое-то неопределённое время суток.Эксперимент 9. Ну, а дальше можно просто поиграться и поусреднять неусредняемое. Например, есть такое видео, где тип, путешествуя, фоткает себя каждый день. Давайте-ка посмотрим, что из этого выйдет.

[embedded content]Интересное видео. Тоже так хочу!

a117daaa609055ee10ebea20805e51ff.png 1afcebc774b593e099116c7eceed5b53.jpg Получилось весьма психоделично. Мне кажется, или он смахивает на Иисуса. Или сам Иисус — это некий усреднённый образ? Эксперимент 10. Да ведь с этой штукой можно заглянуть под воду!!! Вот что я имею в виду: когда море колышется, волны преломляют рисунок дна. Если, конечно, оно видно. Тогда, взяв усреднённый искажённый рисунок с большой экспозицией получим изображение дна без влияния воды. Круто! Выбираем классное длинное видео, на котором сквозь волнующуюся воду видно дно и смотрим:

[embedded content]Попробуйте застать ровную поверхность воды. Не выйдет!

a117daaa609055ee10ebea20805e51ff.png eeea2a4735061bc3d949214d77696f62.jpg Усреднятор усредняет колебания поверхности воды, усредняя тем самым преломление. Видим рисунок дна и гладкую как зеркало поверхность воды! Эксперимент 11. А если усреднить движение, снятое из окна какого-нибудь транспортного средства, то можно получить эффект стремительного движения вперёд. Берём видео с поездов и усредняем буквально по 1 секунде!

[embedded content]

a117daaa609055ee10ebea20805e51ff.png ekspozzer_2014_08_11_22_47_00.jpg Эксперимент 12.[embedded content]a117daaa609055ee10ebea20805e51ff.png ekspozzer_2014_08_11_22_53_58.jpg Получаются неплохие эффекты! Отлично. Я стал экспериментировать с разными видео и получать интересные результаты. Но когда набаловался, мне этого показалось как-то маловато. Круто, но маловато. И тут ко мне пришла ещё одна интересная идея. Когда я смотрел и усреднял видео, снятое из окон движущихся поездов (для эффекта стремительного движения), я понял какой функциональности не хватает моей маленькой программке! А пусть она начнёт ещё и панорамы снимать!

Да, с панорамами всё довольно просто. Поезд движется, картинка в окне меняется, необходимо только брать последовательность изображений из окна с определённым смещением и подклеивать одно к другому слева направо или справа налево. Тогда получится огромное пано с изображением всего того, что проехало за окном. Я тут же начал экспериментировать. Написал интеллектуальный склейщик с детектором границ, но получалось очень плохо! Всё время мешал эффект бочки и скачущая от фрагмента к фрагменту освещённость. Я понял, что до таких гигантов, как, например, Autopano Giga, моей программке не дотянуть практически никогда, и стал хитрить. Выдумывать. Как сделать склейку панорамы плавной и непрерывной. Первая идея, которая пришла ко мне в голову, и стала решающей: необходимо склеивать каждый кадр, а не фрагменты, причём каждый кадр добавлять по одному столбцу в результирующую картинку. Мы берём первый кадр, вырезаем оттуда тонкую вертикальную полосу изображения, берём следующий кадр, вырезаем такую же тонкую полосу и подклеиваем к первой вырезанной полосе. Слева или справа — в зависимости от направления движения камеры, которое можно указать явно. Так как второй кадр отличается от первого на некоторое смещение, то и изображение в двух подклеенных полосах будет представлять из себя нечто вроде развертки панорамы. Эдакий дешёвый аналог slit-камеры (раз, два, три). Получилось? Поехали!

Эксперимент 13. Для начала мне нужно видео, в котором бы неподвижная камера снимала бы некий движущийся объект на неподвижном фоне. Тогда, если объект довольно длинный, его можно «отсканировать» целиком! На роль таких видео идеально подходят движущиеся машины и поезда. Вот такого красавца я собрал, смотрите:

[embedded content]Поезд проходит с 01:57 по 03:17.

a117daaa609055ee10ebea20805e51ff.png ekspozzer_2014_08_12_11_55_45.jpg Разная длина вагонов получилась из-за меняющейся скорости движения поезда. Картинка кликабельна.Получилось неожиданно здорово! Правда, программа снимает панораму жутко сплюснутую по горизонтали, и, чтобы вернуть правильные пропорции, приходится сильно сжимать полученное изображение по вертикали, отчего оно получается маленьким. Это недостаток пожалуй и программы, и подаваемого на вход видео: если бы поезд на нём двигался ооочень медленно, то и пропорции были бы нормальные. Эксперимент 14. Давайте же соберём ещё одну картинку, но на этот раз из окна движущегося поезда.

[embedded content]Камера закреплена довольно-таки хорошо c 3:25.

a117daaa609055ee10ebea20805e51ff.png ekspozzer_2014_08_12_12_07_43.jpg Получилась мини-панорамка города. Картинка кликабельна.И тут с недостатками всё понятно: сильные искажения объектов. Движущиеся объекты ближе к поезду пролетают кадр быстрей, движущиеся дальше от поезда — медленней. Закон параллакса. Значит, объекты переднего плана будут сильно сплюснутыми по горизонтали, а объекты заднего плана сильно вытянутыми. Тут приходится настраиваться на какую-то определённую одну плоскость (дальность объектов от камеры) восприятия. В данном случае — на дома вдалеке. Они получились вполне «собранными». Всё, что ближе (деревья, провода, столбы) будет сильно сплюснуто, всё, что дальше — растянуто. Идеального изображения во всех плоскостях с помощью слит-сканирования получить не удастся. Эксперимент 15. Берём следующий пример и собираем перрон вокзала в Кисловодске:

[embedded content]

a117daaa609055ee10ebea20805e51ff.png ekspozzer_2014_08_13_14_22_21.jpg Здесь видим непропорционально сплюснутые фонари. Каюсь, моя ошибка: так как мы собирали именно перрон, а фонари находятся прямо в центре перрона, то они должны были по идее получиться абсолютно ровненькими. Берём теперь и собираем панораму из другого видео:

[embedded content]

a117daaa609055ee10ebea20805e51ff.png ekspozzer_2014_08_13_14_36_12.jpg Видно как неровно подвешены провода. Картинка кликабельна.Тут я принебрёг деревьями и настроился на отдалённо стоящие хатки. Эксперимент 16. Давайте теперь ещё одно, с пригородом Питера:

[embedded content]Панорама собиралась с 02:43.

a117daaa609055ee10ebea20805e51ff.png ekspozzer_2014_08_13_14_42_55.jpg Дальние дома чуть растянуты, ближние чуть сплюснуты. Систему не сломаешь. Картинка кликабельна.Эксперимент 17. Почему бы не попробовать машины, а не поезда? Я нашёл интересное видео с парада на площади, где неподвижная камера снимала проезжающие на параде машины:

[embedded content]Качество видео ужасное, ваб-камера снимает с очень низким FPS.

a117daaa609055ee10ebea20805e51ff.png ekspozzer_2014_08_13_19_37_14.jpg Отсюда вытекает и качество финальной панорамы. Однако, строй парадной колонны читается вполне естественно. Картинка кликабельна.Наигравшись, я стал тупо баловаться.

Эксперимент 18.[embedded content]Мэд

a117daaa609055ee10ebea20805e51ff.png ekspozzer_2014_08_13_14_47_36.jpg Слит-Мэд Картинка кликабельна.Эксперимент 19.[embedded content]Майкл

a117daaa609055ee10ebea20805e51ff.png ekspozzer_2014_08_13_14_55_28.jpg Слит-Майкл Картинка кликабельна.Эксперимент 20.[embedded content]Володя

a117daaa609055ee10ebea20805e51ff.png ekspozzer_2014_08_13_16_38_59.jpg Слит-Володя Картинка кликабельна.Чарующе! =) Эксперимент 21. И на последок ещё более чарующее: панорама показывает плавное изменение цвета неба в вечернее время. Тут тоже всё довольно просто:

[embedded content]Панорама создавалась с 1 по 38 секунду.

a117daaa609055ee10ebea20805e51ff.png 0caf349c0516f5d80e598390c66ed453.jpg Наблюдаем слева направо восход Солнца.Теперь можете поиграться и вы, скачав эту маленькую и прикольную программу.

90ab36af11e3d783ea47abd0332ccfd2.png Управление в режиме усреднения: выбираем режим «усреднение». Подводим мышь к левому верхнему углу видео и зажимаем »[» — программа запоминает верхний левый угол. Не обязательно, чтобы в этот момент было активно приложение, показывающее видео; может быть активно любое приложение. Подводим мышь к правому нижнему углу видео и жмём »]» — программа запоминает правый нижний угол и, тем самым, все координаты рамки с видео полностью. Запускаем видео. Начинаем усреднять, в любой момент времени зажав »/» на цифровой клавиатуре справа. Во время усреднения программа отчитывается о количестве усредненных кадров. Одинаковые соседние кадры не усредняются, а игнорируются (таким образом, при застывшем видео программа не испортит результат). Усредняем выборочное количество времени. Для завершения усреднения зажимаем »*» на цифровой клавиатуре справа. Результат пишется в ту же папку, где лежит Ekspozzer.Управление в режиме панорамирования: выбираем режим «панорама». Выбираем стрелочку влево, если камера на видео «летит» влево (тобишь картинка движется вправо); или вправо, если камера на видео «летит» вправо (тобишь картинка движется влево). Выбираем ширину панорамы в пикселях. Подводим мышь к верхнему краю видео (примерно в центре) и зажимаем »[» — программа запоминает верхний левый угол. Подводим мышь к нижнему краю видео, чуть-чуть отступив вправо, и жмём »]» — программа запоминает правый нижний угол и, тем самым, координаты «щели», через которую из видео будет собираться панорама. Запускаем видео. Начинаем собирать панораму, в любой момент времени зажав »/» на цифровой клавиатуре справа. Результат пишется в ту же папку, где лежит Ekspozzer.

Прошу не бить: программа изначально создавалась «на коленке» и для себя, юзабилити в программе нет. Всё вышенаписанное является сугубо развлекательным научно-популярным экспериментом.

Благодарю за внимание!

© Habrahabr.ru