Ekspozzer — создание панорамы из видео, усреднение видеопотока
Привет, Хабрахабр! Сразу скажу: ничего феноменального в статье нет. Эта статья посвящена разработанной «на коленке» программе по созданию панорам из видео и временному усреднению видеопотока (кадров). Программа также может быть использована как виртуальная slit-камера. Статья будет интересна всем тем, кто увлекается обработкой видео и изображений, а так же гик-артом. Весьма простая программа — весьма интересный результат. В конце статьи ссылка на скачивание. Осторожно, трафик! Я заметил, что хороший и, главное, востребованный софт рождается не просто так, а из возникающих необходимостей решить ту или иную задачу. Не знаю как у других, а у меня постоянно так и происходит. И эта история — не исключение.Однажды на одном развесёлом графическом форуме у меня случайно завязался спор с одним чувачком, который утверждал примерно следующее: «Невозможно получить изображение пустой Красной Площади днём». Само собой, утверждение дико спорное: да, людей там дофига днём, но можно же всех попросить удалиться. Теоретически это возможно. У простого смертного, конечно, ничего не получится, однако, если вы — какой-нибудь Утин, то, очень постаравшись и позвонив кому надо, вы сможете организовать подобное. Да и что значит «изображение» пустой Красной Площади? Изображение — не фотография, изображение пустой Красной Площади я могу и на бумажке от руки нарисовать. В общем, за давностью лет всех деталей спора не припомню, но он был дико жаркий и мы, буквоеды чёртовы, пришли к такому уточнённому утверждению (примерно): «Из-за огромного количества людей на Красной Площади невозможно, прибегнув только к фото- и видеотехнике, получить в светлое время суток в тёплый туристический сезон (например, лето) фотореалистичное изображение (фотографию) Красной Площади без единого человека на ней с ракурса стоящего в полный рост человека, будучи простым человеком, не имеющим рычагов влияния на правительство». Ну и уточнение! Буквально, юридическое. Теперь всё стало на свои места.
Оппонент утверждал, что сделать такую фотографию можно только прибегнув к Photoshop (или иной программе редактирования изображений) с целью удаления с фотографии Красной Площади всех людей. Процедура эта долгая и кропотливая, и чтобы получить приличный кадр, необходимо будет трудиться как минимум часа три-четыре опытному редактору. Да, несомненно, он прав, это сделать можно. Но если бы этот человек (по профессии художник и фотограф) хоть мало-мальски бы знал математику или представлял бы себе возможности элементарного программирования, то он бы никогда не взялся утверждать такое. Тем более на спор. И я доказал ему обратное.
Если вы хоть раз в жизни держали в руках фотоаппарат, а, тем более, делали снимки, то, наверное, знаете что такое экспозиция. Если совсем просто (для людей, снимающих в режиме «авто») — это продолжительность времени снятия кадра. Наверняка у вас не раз получались «смазанные» фото в движении. Вот! Это как раз экспозиция неправильно была настроена: была слишком большая. А если вдруг фото слишком тёмное получилось, то, скорей всего, экспозиция была слишком мала. Это я совсем уж детским языком рассказываю, чтоб всем было понятно: не касаюсь сейчас настроек диафрагмы и прочих тонкостей съёмки. Так вот, именно подумав об экспозиции мне пришла в голову идея решения этой задачи-спора.
Я подумал: что, если делать очень-очень-очень-оооочень долгую (огромная экспозиция) фотографию Красной Площади, но при сильно-сильно-сильно-сиииильно закрытой диафрагме (чтобы не было пересвета). Ведь тогда люди, ходившие в кадре, просто смажутся, а постоянные детали (строения, Кремль, площадь) останутся на месте. Да! Это ключ к решению. Надо бы как-то попробовать сделать это. Но как? У меня ведь нет возможности попасть на Красную Площадь. Не только ради эксперимента, но вообще, не говоря уже про «ради эксперимента». Ладно, для проверки подойдёт любая другая площадь, это не проблема. Проблема в том, что мой фотоаппарат Canon 550D, который я покупал миллион лет назад, может делать снимки с максимальной экспозицией в 30 секунд, а это очень мало для эксперимента. Покупать новый фотоаппарат ради эксперимента я тоже не могу. Нужна экспозиция реально длинная, где-то минут 30. Для чего? Чтобы повысить шанс того, что люди, находящиеся на площади, точно поменяют свою позицию и уйдут с тех мест, где находились в начале кадра. Грубо говоря, за 30 минут в каждую точку кадра должно попасть больше площади, чем людей. Я стал думать как же малой кровью решить проблему фотографирования?
Но мы не лыком шиты! Ведь у нас есть в руках мощнейшее средство, доступное немногим — программирование! Я решил: можно создать «виртуальный» фотоаппарат, который бы просто фотографировал экран с любой произвольной выдержкой. Знаете все эти программы для записи с экрана: SnagIt, BandiCam, FRAPS… только она записывала бы не один кадр (фото) или последовательность кадров (видео), а накапливала бы информацию (как при длинной экспозиции, что, по сути, и является экспозицией, только электронной), и в конце записи бы усредняла полученную информацию. Тогда, если на экране просто воспроизводить запись с камеры с площади, то это и будет требуемым снимком! Ура! Проблема решена… теоретически. Осталось только создать нужный софт и найти видео с неподвижной камеры, которая бы пол часа снимала площадь.
Хорошо, что запросы к программе пустяковые, и я легко реализовал требуемое за вечер.
С видео тоже не возникло вопросов, так как оных сущий миллиард. Подходят любые мало-мальски хорошие записи с web-камер или камер наблюдения, так как они преимущественно закреплены и на протяжении ролика не двигаются.
Эксперимент 1. Итак, начались эксперименты. Перед вами time-lapse видеозапись с Красной Площади. Но не спешите удивляться, если не видите на видео знакомые места. Красная Площадь в мире не одна (как и Санкт-Петербург и другие до боли знакомые названия), их порядка двадцати. Представленная на видео Красная Площадь находится возле Универсистета Вашингтона. Это очень людное место, являющееся достопримечательностью Университета и даже города. На площади постоянно находятся большое количество студентов, туристов, путешественников, абитуриентов, преподавателей и просто прохожих. Кстати, интересный факт: наша Красная Площадь «красная» потому, что слово «красная» в древности означало «красивая» (а сама площадь изначально строилась белая, из белого кирпича), а Красная Площадь возле Университета Вашингтона «красная» именно потому, что сделана из красноватого камня.
Кстати, вот вам и ирония: в споре с этим типчиком мы не уточняли, какая именно Красная Площадь имеется в виду. Просто подразумевалась наша родная. Так как в мире несколько Красных Площадей, может быть среди них и нашлась бы такая немноголюдная, на которой в определённые моменты дня не было бы людей. Тогда и фотографию можно сделать, тогда я выигрываю спор автоматически.
Ну, долой лирические отступления и иронии. Вот что получилось после усреднения Красной Площади:[embedded content]Видео длится всего 17 секунд, но, так как это time lapse, то фактически на видеозаписи прошедшего времени гораздо больше, чем 17 секунд. Может, 5 минут, может 15.
Как видно из результата, на фото остались только очень долго сидящие в одном и том же месте на протяжении всего ролика люди. Некоторые из них встают и уходят, и получаются так называемые «призраки». В целом, в результате получаем почти то, что надо.Сравните теперь сколько человек на видео и сколько на фото. А сколько бы я мучался в фотошопе, вырезая людей и ища кадры, на которых в вырезанных фрагментах людей нет, чтобы вставить эти фрагменты в пустые части, и, к тому же, вставка получилась бы рваной, так как от кадра к кадру даже фоновое освещение меняется из-за теней облаков, погрешности записи и так далее. А мой ekspozzer сделал это всего за 17 секунд; получилось плавненько и без особого труда. Круто? Круто! И это только начало! Эксперимент 2. Вернёмся же к нашей Красной Площади. Я так и не нашёл достаточно хорошее и длинное видео, снятое с самой площади с помощью неподвижной камеры. Даже time lapse: там вообще ребята всё время наровят плавненько подвигать камеру. Нашёл только вот такое видео:
[embedded content]Обратите внимание на огромное количество машин на Большом Каменном Мосту.
Получилось очень приятно и гладенько, несмотря на пляшущие тени от облаков.И куда девались машины после усреднения? Правильно: исчезли. Зацените какая чистенькая картинка получилась. Ну разве можно такой кадр днём поймать? Конечно, у любого метода есть погрешности. Так и у моего: нет-нет, да и останутся кое-где «призраки» машин или людей. На самом деле матемаика тут довольно простая. Если в видео из 100 кадров человек встречается в 5 кадрах, то он будет призрачен на 100 — 5 = 95 процентов. То есть 95 процентов информации будет получено с площади, а 5 — с человека. При такой пропорции его практически не видно. А так как люди и машины вообще постоянно движутся, то процент и того меньше! Просто шоколад! Эксперимент 3. Идём дальше, берём самую густозаполненную площадь в мире — Нью-Йоркскую Таймс Сквер:
[embedded content]Здесь всё буквально кишит людьми и машинами.
А на выходе получили только стоящую одиноко полицейскую тачку…Эксперимент 4.… и ещё кучу призрачных разводов на улице слева. Ну что ж, это и есть неидеальность метода. Ещё:
[embedded content]Видео длится всего 16 секунд.
Следовательно, и результат будет хуже! Эксперимент 5.[embedded content]Оживлённая Уолл-Стрит.
Результат впечатляет. Чисто! Значит, почти все движутся и мало стоят на месте.Тут всё ясно: чем короче экспозиция и медленней движутся объекты, тем больше будут выражены призраки. И наоборот: чем длиннее экспозиция и быстрее движутся объекты, тем лучше будет виден фон. В таком случае идеальны длинные time lapse видео, снятые неподвижной камерой. Что ж, таких роликов превеликая тыщща.
Эксперимент 6. Начинаем смотреть другие результаты. Вот видео с камеры наружнего наблюдения за перекрёстком, на котором происходит ДТП:
[embedded content]Усредялось с 20 по 40 секунду, всего 20 секунд.
Неплохой чистенький перекрёсточек с призраком белой машины.Эксперимент 7. А вот как раз тот самый идеальный экземпляр: длинное time lapse видео, запись с людной улицы в Арнсберге, Германия:
[embedded content]Обратите внимание как колышатся флаги на ветру.
В результате они колышатся и на усреднённом фото. Людей наблюдаю едва-едва.Эксперимент 8. Ну и куда ж без Эйфелевой башни!
[embedded content]Этот time lapse длится почти сутки! Идеальный вариант, но как поведёт себя усреднение при переходе с дня в ночь и наоборот?
Получилось очень даже сносно и загадочно. Какое-то неопределённое время суток.Эксперимент 9. Ну, а дальше можно просто поиграться и поусреднять неусредняемое. Например, есть такое видео, где тип, путешествуя, фоткает себя каждый день. Давайте-ка посмотрим, что из этого выйдет.
[embedded content]Интересное видео. Тоже так хочу!
Получилось весьма психоделично. Мне кажется, или он смахивает на Иисуса. Или сам Иисус — это некий усреднённый образ? Эксперимент 10. Да ведь с этой штукой можно заглянуть под воду!!! Вот что я имею в виду: когда море колышется, волны преломляют рисунок дна. Если, конечно, оно видно. Тогда, взяв усреднённый искажённый рисунок с большой экспозицией получим изображение дна без влияния воды. Круто! Выбираем классное длинное видео, на котором сквозь волнующуюся воду видно дно и смотрим:
[embedded content]Попробуйте застать ровную поверхность воды. Не выйдет!
Усреднятор усредняет колебания поверхности воды, усредняя тем самым преломление. Видим рисунок дна и гладкую как зеркало поверхность воды! Эксперимент 11. А если усреднить движение, снятое из окна какого-нибудь транспортного средства, то можно получить эффект стремительного движения вперёд. Берём видео с поездов и усредняем буквально по 1 секунде!
[embedded content]
Эксперимент 12.[embedded content] Получаются неплохие эффекты! Отлично. Я стал экспериментировать с разными видео и получать интересные результаты. Но когда набаловался, мне этого показалось как-то маловато. Круто, но маловато. И тут ко мне пришла ещё одна интересная идея. Когда я смотрел и усреднял видео, снятое из окон движущихся поездов (для эффекта стремительного движения), я понял какой функциональности не хватает моей маленькой программке! А пусть она начнёт ещё и панорамы снимать!
Да, с панорамами всё довольно просто. Поезд движется, картинка в окне меняется, необходимо только брать последовательность изображений из окна с определённым смещением и подклеивать одно к другому слева направо или справа налево. Тогда получится огромное пано с изображением всего того, что проехало за окном. Я тут же начал экспериментировать. Написал интеллектуальный склейщик с детектором границ, но получалось очень плохо! Всё время мешал эффект бочки и скачущая от фрагмента к фрагменту освещённость. Я понял, что до таких гигантов, как, например, Autopano Giga, моей программке не дотянуть практически никогда, и стал хитрить. Выдумывать. Как сделать склейку панорамы плавной и непрерывной. Первая идея, которая пришла ко мне в голову, и стала решающей: необходимо склеивать каждый кадр, а не фрагменты, причём каждый кадр добавлять по одному столбцу в результирующую картинку. Мы берём первый кадр, вырезаем оттуда тонкую вертикальную полосу изображения, берём следующий кадр, вырезаем такую же тонкую полосу и подклеиваем к первой вырезанной полосе. Слева или справа — в зависимости от направления движения камеры, которое можно указать явно. Так как второй кадр отличается от первого на некоторое смещение, то и изображение в двух подклеенных полосах будет представлять из себя нечто вроде развертки панорамы. Эдакий дешёвый аналог slit-камеры (раз, два, три). Получилось? Поехали!
Эксперимент 13. Для начала мне нужно видео, в котором бы неподвижная камера снимала бы некий движущийся объект на неподвижном фоне. Тогда, если объект довольно длинный, его можно «отсканировать» целиком! На роль таких видео идеально подходят движущиеся машины и поезда. Вот такого красавца я собрал, смотрите:
[embedded content]Поезд проходит с 01:57 по 03:17.
Разная длина вагонов получилась из-за меняющейся скорости движения поезда. Картинка кликабельна.Получилось неожиданно здорово! Правда, программа снимает панораму жутко сплюснутую по горизонтали, и, чтобы вернуть правильные пропорции, приходится сильно сжимать полученное изображение по вертикали, отчего оно получается маленьким. Это недостаток пожалуй и программы, и подаваемого на вход видео: если бы поезд на нём двигался ооочень медленно, то и пропорции были бы нормальные. Эксперимент 14. Давайте же соберём ещё одну картинку, но на этот раз из окна движущегося поезда.
[embedded content]Камера закреплена довольно-таки хорошо c 3:25.
Получилась мини-панорамка города. Картинка кликабельна.И тут с недостатками всё понятно: сильные искажения объектов. Движущиеся объекты ближе к поезду пролетают кадр быстрей, движущиеся дальше от поезда — медленней. Закон параллакса. Значит, объекты переднего плана будут сильно сплюснутыми по горизонтали, а объекты заднего плана сильно вытянутыми. Тут приходится настраиваться на какую-то определённую одну плоскость (дальность объектов от камеры) восприятия. В данном случае — на дома вдалеке. Они получились вполне «собранными». Всё, что ближе (деревья, провода, столбы) будет сильно сплюснуто, всё, что дальше — растянуто. Идеального изображения во всех плоскостях с помощью слит-сканирования получить не удастся. Эксперимент 15. Берём следующий пример и собираем перрон вокзала в Кисловодске:
[embedded content]
Здесь видим непропорционально сплюснутые фонари. Каюсь, моя ошибка: так как мы собирали именно перрон, а фонари находятся прямо в центре перрона, то они должны были по идее получиться абсолютно ровненькими. Берём теперь и собираем панораму из другого видео:
[embedded content]
Видно как неровно подвешены провода. Картинка кликабельна.Тут я принебрёг деревьями и настроился на отдалённо стоящие хатки. Эксперимент 16. Давайте теперь ещё одно, с пригородом Питера:
[embedded content]Панорама собиралась с 02:43.
Дальние дома чуть растянуты, ближние чуть сплюснуты. Систему не сломаешь. Картинка кликабельна.Эксперимент 17. Почему бы не попробовать машины, а не поезда? Я нашёл интересное видео с парада на площади, где неподвижная камера снимала проезжающие на параде машины:
[embedded content]Качество видео ужасное, ваб-камера снимает с очень низким FPS.
Отсюда вытекает и качество финальной панорамы. Однако, строй парадной колонны читается вполне естественно. Картинка кликабельна.Наигравшись, я стал тупо баловаться.
Эксперимент 18.[embedded content]Мэд
Слит-Мэд Картинка кликабельна.Эксперимент 19.[embedded content]Майкл
Слит-Майкл Картинка кликабельна.Эксперимент 20.[embedded content]Володя
Слит-Володя Картинка кликабельна.Чарующе! =) Эксперимент 21. И на последок ещё более чарующее: панорама показывает плавное изменение цвета неба в вечернее время. Тут тоже всё довольно просто:
[embedded content]Панорама создавалась с 1 по 38 секунду.
Наблюдаем слева направо восход Солнца.Теперь можете поиграться и вы, скачав эту маленькую и прикольную программу.
Управление в режиме усреднения: выбираем режим «усреднение». Подводим мышь к левому верхнему углу видео и зажимаем »[» — программа запоминает верхний левый угол. Не обязательно, чтобы в этот момент было активно приложение, показывающее видео; может быть активно любое приложение. Подводим мышь к правому нижнему углу видео и жмём »]» — программа запоминает правый нижний угол и, тем самым, все координаты рамки с видео полностью. Запускаем видео. Начинаем усреднять, в любой момент времени зажав »/» на цифровой клавиатуре справа. Во время усреднения программа отчитывается о количестве усредненных кадров. Одинаковые соседние кадры не усредняются, а игнорируются (таким образом, при застывшем видео программа не испортит результат). Усредняем выборочное количество времени. Для завершения усреднения зажимаем »*» на цифровой клавиатуре справа. Результат пишется в ту же папку, где лежит Ekspozzer.Управление в режиме панорамирования: выбираем режим «панорама». Выбираем стрелочку влево, если камера на видео «летит» влево (тобишь картинка движется вправо); или вправо, если камера на видео «летит» вправо (тобишь картинка движется влево). Выбираем ширину панорамы в пикселях. Подводим мышь к верхнему краю видео (примерно в центре) и зажимаем »[» — программа запоминает верхний левый угол. Подводим мышь к нижнему краю видео, чуть-чуть отступив вправо, и жмём »]» — программа запоминает правый нижний угол и, тем самым, координаты «щели», через которую из видео будет собираться панорама. Запускаем видео. Начинаем собирать панораму, в любой момент времени зажав »/» на цифровой клавиатуре справа. Результат пишется в ту же папку, где лежит Ekspozzer.
Прошу не бить: программа изначально создавалась «на коленке» и для себя, юзабилити в программе нет. Всё вышенаписанное является сугубо развлекательным научно-популярным экспериментом.
Благодарю за внимание!