Створення наддовгих плоских панорамних зображень з відео



Передісторія
Пару років тому на Хабре була стаття, присвячена Адаму Мадяру Камера Ейнштейна: як один фотограф зображує час. Мені вона здалася дуже цікавою, але, якщо чесно, то я так і не зрозумів технологію для зйомки відео Stainless. Особливо мене захопили його фотографії поїзда метро. Після чого я задався думкою: а чи можу я сам створити щось подібне?

Постановка завдання
Недалеко від села, де живуть мої родичі, проходить залізниця і одного разу поїхавши в гості, я прихопив з собою камеру і штатив. Суть завдання, яке я поставив перед собою зводилася до того щоб створити панорамне зображення поїзда, досить довге, щоб його неможливо було зняти просто зібравши плоску панораму. Тобто, я зібрався відзняти відео і вирізавши по центральній смужці з кожного кадру об'єднати їх в надії отримати дуже довгу і красиву панораму. Оскільки я був щасливим володарем камери Canon EOS 600D (технічні характеристики з максимальною частотою 60 FPS при дозволі відео 1280x720, то розраховувати на більш високу частоту не доводилося. З іншого боку панорама висотою 1280 пікселів перевершує вертикальне дозвіл більшості моніторів. Тому, я вважав, якість результату має мене влаштувати.

Приклади в мережі Інтернет
Перш ніж продовжити, я хотів би навести список посилань на роботи з даної тематики, які мені вдалося виявити.

Зйомка! Мотор! Поїхали!
Отже, я встановив штатив на відстані близько 10 метрів від рейок (чим ближче до колії, тим сильніше тряска камери) та встановив камеру у вертикальному положенні. Оскільки нам з усього відео кадру потрібна лише середня смужка, то правильніше встановлювати камеру саме у вертикальному, а не горизонтальному положенні, так як в цьому випадку дозвіл панорами буде вище. Наприклад, при горизонтальна орієнтація 1920Х1080 дасть нам панораму висотою 1080 пікселів, а вертикальна орієнтація 1080x1920 дасть нам панораму висотою 1920 пікселів.

Зйомку відео найкраще вести в ручному режимі, тобто без участі автоматики. Коли об'єкт потрапляє в кадр, то може сильно змінитися освітленість сцени, що змусить камеру поміняти витримку або діафрагму, а це робити небажано. Інакше різні частини, наприклад, потяги можуть бути різними по яскравості. Частота кадрів для обраного дозволу природно повинна бути максимальною. Починаємо зйомку секунд за 5-10 до того моменту як об'єкт потрапить в кадр. По-перше, на всяк випадок, по-друге, камера перестала ворушитися після натискання на кнопку запису, і по-третє, щоб можна було вибрати фоновий кадр (якщо освітлення швидко змінюється, наприклад з-за хмар). Закінчуємо зйомку теж не відразу, а через 5 секунд. На своєму особистому досвіді я переконався, що при зйомці бажано прорахувати буде входити об'єкт в кадр повністю і не буде зайвого порожнього простору. У мене на декількох панорамах верхня частина поїздів трохи обрізана. Ну і звичайно, бажано виставити ручний фокус і заздалегідь сфокусуватися на об'єкті (хоч це і важко буває зробити, адже самого об'єкта поки ще немає).

Програмна частина
Мною була написана програма Trainz Pano (C++ Builder XE3). Додаток 64-розрядне, ОС — Windows 7/8/10. Вона заточена саме на створенні панорам з відео. Програма доступна як комерційний продукт і легко гуглится.

Робота з додатком
Щоб полегшити життя і собі і користувачам я розбив процес створення панорами на дві частини: власне складання та редагування. Зроблено це з причини того, що великий обсяг даних краще зберегти на проміжному етапі, щоб їх не втратити. Саме з цієї причини додаток є 64-бітним.

Відкриття відео


Я не став морочитися з декодуванням відео, моє додаток використовує FFMPEG і спочатку отримує з відео набір зображень, а потім вже з ними працює.

Настройка параметрів фону


На самому першому зображенні Ви можете бачити повторюваний візерунок в якості фону. Пов'язано це з тим, що з кожного кадру вирізається смужка шириною близько декількох десятків пікселів. Власне вони й повторюються, якщо не перекриваються об'єктом. Щоб позбутися такого фону і замінити його на монотонні лінії у програмі є можливість автоматизувати цей процес. На жаль, результат мене іноді трохи розчаровує, тому для отримання якісного результату після процесу складання можна перейти до ділянкам.Отже, налаштовуємо параметри фону.

Збірка панорами
При зйомці відео камера, по відношенню до об'єкта може бути розташована не прямо, а під деяким кутом. Крім того, камера може бути розташована під кутом до траєкторії руху об'єкта. Щоб компенсувати їх вплив в додатку є два елементи управління: Обертання та Перспектива. Вони визначаються шляхом підбору таким чином, щоб отримується зображення не мало щербин при стикуванні окремих ділянок. Ще один параметр — це Ширина. Він потрібний для вказівки ширини смужок, які будуть вирізатися з поточного кадру і додаватися в результуючу панораму. Всі три параметри можна змінювати в процесі складання панорами. Однак найчастіше Обертання та Перспектива налаштовуються на початковому етапі і надалі не змінюються. А ось параметр Ширина може мінятися, так як швидкість руху об'єкта може бути мінливою. В моєму випадку я багато разів стикався з прискоренням і сповільненням руху поїздів.

Якщо ми знімаємо відео у вертикальній орієнтації, то нам знадобиться вказати в головному меню кут повороту кратний 90 градусам. Є ще один момент, який слід враховувати. Коли я писав програму, то виходив з того, що рух об'єкта здійснюється справа-наліво. Що робити, якщо в дійсності рух об'єкта здійснюється зліва-направо? Для цього можна на етапі складання використовувати пункт відобразити зліва-направо, при цьому всі написи ми отримаємо в дзеркальному відображенні. А на етапі ретушування скористаємося командою Відображення панорами зліва-направо і все встане на свої місця.

Ретушування панорами


Щоб позбутися від повторюваного фону (якщо програма не змогла зробити це сама) або відновити зображення об'єкта, якщо він був невірно визначений як фон завантажуємо наше зображення (точніше шари зображення, там їх 3) в програму Trainz Pano Editor. Ось короткий список функцій, який надає програма:
  • Ретушування
  • Додавання стовпів
  • Видалення стовпців
  • Вертикальна заливка фоном
  • Додавання рядків
  • Видалення рядків
  • Горизонтальна заливка фоном
  • Градієнтний перехід
  • Прискорений рух


Відео роботи з програмою
On-line довідка перебуває тут.

Перегляд панорам
При збереженні панорам виявилася одна неприємна деталь, а саме — формат JPEG має обмеження на розміри зображення. Для довжини і ширини використовуються 2 байти, тому записати панораму завдовжки більше 65535 пікселів не вдасться. У той же час у мене були панорами довжиною до 200 000 пікселів і більше. Збереження в BMP і PNG проблем не створює, от тільки зображення у цих форматах займають багато місця на диску. При спробі відкрити для перегляду великі панорами теж виникли деякі проблеми. XnView і XnViewMP показують місиво з пікселів, про що я написав автору програми, сподіваюся в найближчих версіях цей баг пофиксят. Вбудований просмотровщик Windows Фотографії відкрив на ура, не підкачав і InfanView. Загалом слід виходити з того, що не всі вюверів покажуть нам довгі панорами коректно.

Приклади моїх робіт
Ознайомитися з деякими прикладами моїх робіт можна на сайт. Правда, там вони значно зменшені в розмірах.


Можлива область застосування
Крім панорамних зйомок поїздів програму можна використовувати для створення панорам колон авто мото техніки, суден, колони людей на парадах, демонстраціях, маніфестаціях. При наявності хороших доріг можна спробувати зняти панорамні зображення вулиць або пейзажів, наприклад, з поїзда, трамвая або автомобіля.

Плани щодо поліпшення програми
  • Читання кадрів безпосередньо в додаток без необхідності проміжного збереження зображень на диск.
  • Поліпшити швидкість складання панорам.
  • Написати новий алгоритм визначення фону.
  • Написати JavaScript бібліотеки з використанням HTML5 Canvas для відображення дуже довгих панорам.


Висновки
  • В даний час на ринку немає програм для створення панорамних зображень з відео файлів.
  • Ті поодинокі приклади панорам, що доступні в мережі, як правило, створені з використанням домашніх заготовок, які не є готовими комерційними продуктами.
  • Trainz Pano в якійсь мірі вирішує озвучену вище завдання.
  • На жаль, у програмі Trainz Pano поки що недостатньо реалізована якісна технологія відділення об'єктів від фону, що (в загальному випадку) призводить до необхідності ретушування панорами в досить великому обсязі.
  • Разом з тим, при грамотному використанні (вибір вдалого місця зйомки проти монотонного фону) програма цілком може бути використана як професіоналами, так і аматорами цифрового фото.

Зустрічали Ви раніше довгі панорамні зображення поїздів, колон людей, авто і мото техніки?

/>
/>


<input type=«radio» id=«vv72891»
class=«radio js-field-data»
name=«variant[]»
value=«72891» />
Так, багато
<input type=«radio» id=«vv72893»
class=«radio js-field-data»
name=«variant[]»
value=«72893» />
Так, в основному ті, що можна подивитися за посиланнями в статті
<input type=«radio» id=«vv72895»
class=«radio js-field-data»
name=«variant[]»
value=«72895» />
Немає

Проголосувало 25 осіб. Утрималося 5 чоловік.


Ви самі захоплюєтесь панорамною зйомкою?

/>
/>

<input type=«radio» id=«vv72897»
class=«radio js-field-data»
name=«variant[]»
value=«72897» />
Так, збирав звичайні плоскі панорами
<input type=«radio» id=«vv72899»
class=«radio js-field-data»
name=«variant[]»
value=«72899» />
Так, збирав циліндричні та/або сферичні панорами
<input type=«radio» id=«vv72901»
class=«radio js-field-data»
name=«variant[]»
value=«72901» />
Немає

Проголосувало 27 осіб. Утрималося 7 осіб.


Тільки зареєстровані користувачі можуть брати участь в опитуванні. Увійдіть, будь ласка.


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.