20081025

Как сшивать панорамы

Давно хотел написать эту заметку. Расскажу о том, как можно сравнительно легко склеивать панорамы из отдельных фотоснимков. Хотя на всех иллюстрациях снимки экрана сделанны в линуксе, все описываемые программы доступны и пользователям других операционных систем (Windows, MacOS X). Так что аудитория этой заметки заметно шире моей обычной аудитории. В отличие от панорамного софта, который чаще всего упоминается в рунете, эти программы свободны и распространяются бесплатно. Итак, герои сегодняшнего дня:

Hugin. Графический интерфейс для склейки панорам. В примерах использовалась версия 0.7.0-beta5. Программа названа в честь одного из воронов Одина.

Autopanosift. Программа ищет «связующие точки» между отдельными кадрами. В большинстве случаев вызывается из Хугина.

Enblend. Бесшовно склеивает отдельные кадры в единое изображение. Она обычно тоже запускается автоматически из Хугина, хотя в сложных случаях её можно запускать и вручную.

Ещё потребуется какой-нибудь графический редактор. В примерах у меня будет показан nip2 (умеющий работать даже с очень большими изображениями) и Gimp. В общем, это дело вкуса.

В общих чертах, технологический процесс выглядит так:

  1. снимаем фото,
  2. загружаем отдельные кадры в Хугин,
  3. ищем «связующие точки» между отдельными кадрами, или автоматически (с помощью Autopanosift), или вручную,
  4. оптимизируем панораму (после этого отдельные кадры располагаются так, чтобы связующие точки по возможности совпадали), смотрим на предварительный результат,
  5. окончательно выбираем проекцию и склеиваем кадры в единую панораму (на этом этапе пригождается Enblend),
  6. обрезаем сшитую панораму, проверяем на наличие ошибок сшивки,
  7. окончательно ретушируем кадр, как в случае обычных фото.
Теперь подробнее о каждом этапе.

Как снимать панорамы


Нужно взять фотокамеру и последовательно снимать фрагменты будущей панорамы. Здесь есть несколько тонкостей:

  • кадры должны перекрываться примерно на треть, это необходимо для успешного поиска связующих точек между отдельными кадрами,
  • составлять горизонтальные панорамы удобнее из вертикальных кадров, таким образом вертикальный угол зрения однорядной панорамы будет шире, панорама будет восприниматься естественнее при просмотре целиком на экране компьютера, больше будет запас для окончательного кадрирования,
  • чаще всего удобно снимать с широким углом изображения (на минимальном «зуме»), в этом случае панорама будет состоять из минимального числа кадров (и наоборот, когда цель состоит в создании максимально детальной панорамы, стоит снимать длиннофокусным объективом, но в несколько «рядов»),
  • используйте бленду или прикрывайте объектив рукой, чтобы избежать бликов на объективе (при съёмке панорам часто приходится снимать почти против света),
  • не используйте поляризатор, хотя он и делает цвета сочнее на отдельных кадрах, из-за него небо на панораме в целом выглядит неестестсвенно,
  • снимайте все кадры панорамы с одними и теми же настройками экспозиции и баланса белого; хотя Хугин и Enblend и умеют выравнивать экспозицию и баланс белого в итоговой панораме, это не всегда получается достаточно хорошо, а разные цветовые тона сразу делают заметными отдельные кадры в панораме; тут очень может пригодится ручной режим экспозиции в фотокамере (если такой есть),
  • то же относится и к фокусному расстоянию, сшивать будет проще, если все кадры будут сняты с одним и тем же фокусным расстоянием,
  • старайтесь снимать с горизонтально выровненного штатива, если есть такая возможность; конечно, можно успешно снять панораму и с рук, но очень многие панорамы мне не удались именно из-за того, что я поленился достать штатив,
  • как в случае штатива, так и в случае съёмки с рук, важно обеспечить неподвижность оси вращения камеры, в идеале она должна проходить через оптическую ось объектива; особенно хорошо, если ось пройдёт через «точку без параллакса» (вот тут о её поиске по-английски),
  • последние два правила особенно важны, если объекты переднего плана расположены близко к камере,
  • лучше снимать все кадры последовательно в одном направлении, или слева направо, или справа налево, это минимизирует смещение подвижных объектов (например, облаков) в соседних кадрах; если в панораму попадает какой-то быстродвижущийся объект (например, машина, животное, человек), то потом бывает удобно иметь любой кадр панорамы в двух вариантах, с объектом и без него.
Многие из этих «хитростей» я почерпнул отсюда (текст по-итальянски). Это проект, который объединяет 380 круговых панорам, снятых с разных вершин в западных Альпах. Кстати, интересный пример того, что можно сделать со снятыми панорамами.

В результате получаем набор кадров будущей панорамы. Например, такой:



Как склеивать кадры в Hugin



Запускаем Хугин. В современных версиях Хугина все основные действия доступны прямо с его первой вкладки. По порядку, сверху вниз. Вначале загружаем фото:



После этого нужно создать контрольные точки. Жмём «Объединить…»:



После этого запустится Autopanosift:



Как правило, достаточно нажать кнопку «Compute» и дождаться, пока программа найдёт все контрольные точки.



Когда Autopanosift закончит, кнопка «Exit» в его окошке станет доступна:



Жмём и попадаем обратно в Хугин. Вначале откроется окно предварительного просмора



Это результат предварительной сшивки. Чтобы увидеть проблемные области, удобно переключить режим совмещения с нормального на «Разницу», тогда в области перекрытия кадров светлый цвет будет соответствовать несовпадению изображений:



Однако закроем предварительный просмотр и вернёмся на первую вкладку Хугина. Там будут указаны параметры оптимизации. В данном случае предварительный результат оставляет желать лучшего:



Максимальная погрешность оптимизации составила 25 пикселей, т.е. одна из контрольных точек отстоит от своей пары на соседнем снимке на 25 пикселей. Это действительно плохо.

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



Проблемная точка оказалась где-то в облаках. И это хорошо, это легко исправить. Вообще, следует избегать размещения контрольных точек на изменчивых объектах: облаках, качающейся траве, волнах. Контрольные точки на таких объектах — почти гарантия проблем сшивки.

К сожалению, Autopanosift не умеет распознавать объекты на фото и предсказывать их поведение. Поэтому результаты его работы требуется корректировать вручную. В частности, точки на облаках можно просто убрать.

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

На иллюстрации я добавляю такую точку:



Для этого я щёлкаю на выбранной точке на снимке слева, а затем примерно в том же месте на снимке справа. Чаще всего Хугин правильно размещает парную точку на втором снимке. Иногда же ему это не удаётся, и тогда можно увидеть такое сообщение:



Ничего страшного, парную точку можно уточнить вручную. Современные версии Хугин услужливо увеличивают окрестность точки, так что правильно поставить парную точку легко. Уточнив её положение, нажимаем «Добавить».

Ещё пара советов о расположении точек: избегайте «кучкования» всех контрольных точек в одном месте, особенно если это место находится на переднем плане, небольшие ошибки в положении этих точек будут соответствовать большим смещениям кадра при оптимизации. Старайтесь «выкладывать» контрольные точки вдоль важных для глаза контуров (и наоборот, не ставьте слишком много там, где глаз не чувствует линии).

Вот, например, сравните как расставила точки программа:



и как лучше их расположить:



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

Поправив контрольные точки, попробуем ещё раз оптимизировать панораму. Кстати, если перейти на вкладку «Оптимизатор», то можно будет выбрать, какие именно параметры кадра оптимизировать. Мне кажется, что очень часто лучших результатов можно достичь, если оптимизировать не только положение кадра, но и его поворот вокруг оптической оси, «(y,p,r)». Особенно это верно для панорам, снятых с рук (снимая с рук, легко нечаянно немного наклонить камеру).



Заново оптимизировав, можно ещё раз посмотреть на результат в области предварительного просмотра:



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

Очень полезны функции «По центру» и «Уместить», а вот функцией «Выровнять» надо пользоваться осторожно. Если панорама была снята с горизонтально выровненного штатива, то выравнивание вообще не должно требоваться, если же сняли с рук, и кадры пошли «волной», то иногда выравнивание помогает убрать волну, но мне кажется, что при этом ухудшается результат сшивки. Функция «Выровнять» в Хугине довольно новая.

Теперь, если всё в порядке, делаем последний шаг. Переходим на вкладку «Сшиватель», выбираем проекцию, советую ещё раз рассчитать поле зрения и выбрать оптимальный размер (при котором не происходит уменьшения изображения).



Для просмотра на экране целиком, на мой взгляд, очень хорошо подходит цилиндрическая проекция. Если же планируется просматривать в тех или иных программах просмотра, например в апплете PTViewer, то лучше использовать эквидистантную проекцию (или ту, которую требует программа просмотра). А «рыбий глаз», по-моему, лучше всё равно снимать «рыбьим глазом».

Результат сшивки я всегда сохраняю в формате TIFF, потому что потом его ещё приходится редактировать. Жмём «Собрать», и ждём:



Ждём долго, это, пожалуй, самый долгий вычислительный процесс во всей технологической цепочке. Конец этого процесса выглядит примерно так:



Всё. У нас теперь есть большой файл со сшитой панорамой. Сохраняем проект Хугина и закрываем. Дальше нужно довести сшитую панораму до ума.

Обработка сшитой панорамы



Итак, у нас теперь есть TIFF-файл со сшитой панорамой. Он может быть довольно большим. В этом примере он получился 101 мегабайт. В действительно больших панорамах счёт может пойти на гигабайты. Поэтому я приведу пример, как можно обрезать панораму в редакторе nip2, который может работать даже с изображениями, размер которых превышает размер оперативной памяти.



Вообще, редактор nip2 довольно нетрадиционный. Советую для первого знакомства посмотреть заметку о нём Михаила Конника. Редактор по принципу работы больше похож на электронные таблицы, но работает действительно быстро.

Чтобы обрезать нашу панораму, дважды щёлкнем по ячейке с исходным файлом A1. Откроется новое окно с изображением:



Масштабируем с помощью Ctrl+колёсико мышки. Зажав Ctrl и перетягивая мышку от левого верхнего угла к правому нижнему выделяем прямоугольную область:



Да, выделять прямоугольную область в nip2 нужно именно так: от верхнего левого угла к правому нижнему и зажав Ctrl.

Теперь в главном окне nip2 появляется новая ячейка A2:



Именно содержимое этой ячейки (уже обрезанную панорамe) мы и сохраняем в файл.

В данном случае я обрезал с небольшим запасом, поэтому в одном месте на краю панорамы есть дырка:



По-моему, лучше оставить такую дырку в малозначительном месте, чем отрезать что-то важное в другом месте панорамы. А в малозначительном месте можно помахать клонирующей кистью:



Наконец, сохраняем окончательный вариант панорамы, добавляем геотаги, и любуемся:



Чтобы добавить геотаги потребуется скопировать EXIF-теги из исходных кадров в окончательный вариант панорамы. Я это делают так:
$ exiftool -tagsfromfile первый-кадр.jpg панорама.jpg
Это не совсем правильно, но быстро.

Что ещё можно сделать с панорамой?



Одно из самых интересных панорамных сообществ, на мой взгляд, группа Perfect Panoramas на фликере. Туда принимают только те панорамы, в которых модераторы не найдут дефектов.

Есть фотосообщество в ЖЖ, тоже посвященное панорамам. Не помню, как называется.

Панорамам с геотегами — самое место на Panoramio. Хорошие панорамы потом покажут в Google Earth :)

В интернете панорамы можно показывать с помощью апплета PTViewer.

Дополнение 2010-02: со времени написания заметки появился хороший панорамный хостинг pan0.net. На него можно выкладывать как круговые, так и частичные панорамы. Есть флэш-просмотрщик, который можно легко вставлять в блоги.



Перфекционисты и любители монументального искусства могут снимать гигапиксельные панорамы.

Ну и в общем ещё много разных применений этой техники. В том числе и вполне серьёзных.

Успехов!

PS. Я нашёл ещё два сходных руководства на русском языке: Клеим панораму Александра Прокудина и Склейка панорам в Hugin (© БэЖэ). Много учебных материалов доступно на сайте программы Hugin, но, увы, только на английском языке.

20081021

Debian Unstable → Ubunty Hardy → Ubuntu Intrepid (и, наверно, обратно)

Мой ноутбук переживал тяжёлый возрастной кризис. Стал необъяснимо зависать cron (при запуске). Потом стал зависать login. И ещё машина стала иногда зависать при засыпании. В общем, я не исключал и аппаратной проблемы. Зависимость от внешнего охлаждения у машинки уже давняя и прочная (перегревы бывают). А тут, раскурочив, я вынул из её чрева летавший там туда-сюда отвинтившийся непонятно от чего винт. Однако memtest86+ ошибок не находил. В общем, решил попробовать поставить «чистую» систему, чтобы посмотреть, не будет ли чудес и там. Быстренько сбросил образы /home и / на внешний диск (на всякий пожарный, dd if=/dev/раздел of=/media/внешнийдиск/backup/файл.img bs=1k conv=noerror,sync) и начал.

Поскольку под рукой был диск с Ubuntu 8.04.1, да и давно уже хотелось посмотреть не текущий уровень достижений в убунтустроении, поставил его. Поставилось нормально. /home оставил тот же. Почти всё, что должно работать, вроде работает. Из приятного: если в начале установки попросить показать подробную информацию по релизу, то запускается браузер, и можно что-нибудь в интернете почитать, пока ставится. Инсталятор Debian не видел давно, пока счёт 0:0.

Ещё из приятного, по причине того, что созданный пользователь имел тот же логин и ID, что и раньше, все старые настройки сохранились и замена системы была бы совсем незаметна, если бы не изменились версии кое-каких программ и не пришлось ставить кое-что заново (по мере необходимости). Ну и минимальные отличия вроде того, что Iceweasel здесь зовётся Firefox-ом :) 1:1

Из неприятного. Репозиторий Ubuntu субъективно меньше. Например, мой любимый Simutrans (это такая игрушка, железные дороги строить, паровозики гонять) для Ubuntu не упакован. Собрал из исходников. Да только вот тормозит, время от времени. Хотя за пару дней до этого ровно та же самая версия в Debian работала безукоризненно. Ну да, это развлечения, но для меня лично — уже 2:1. :)

В видеопроигрывателе Totem (через Gstreamer) по-умолчанию как бы играются MIDI (но без звука!). Зато, видимо как раз из-за MIDI время от времени тормозят программы, использующие SDL_mixer (упомянутая выше Simutrans перестаёт тормозить после отключения MIDI). В Debian GStreamer даже не пытался играть MIDI (когда я последний раз пытался), а SDL_mixer не тормозит. 3:1.

Ещё из неприятного, при подключении моего Garmin GPSmap 60Cx к USB порту, в Ubuntu Hardy устройства /dev/ttyUSB0 не создаётся (соответственно, всякие мои скрипты не работают). Как выяснилось, нужно раскоментировать garmin_gps в /etc/modprobe.d/blacklist. Прогрессивный метод писать в параметрах GPSbabel «-f usb:» у меня лично не работал. 4:1 в пользу Debian.

Зато моя WiFi карточка заработала «из коробки», как и Network Manager. 4:2.

А ещё жене понравилась оболочка для установки-удаления программ. 4:3.

Засыпание-просыпание работает пока без нареканий (то ли время слишком мало прошло, то ли действительно работает). 4:4. Зато кнопки управления яркостью экрана впервые за много лет поменялись местами (т.е. та, которая должна увеличивать яркость — уменьшает, и наоборот). В Debian всё было в порядке, я вообще был уверен, что они аппаратно реализованы. Это конечно мелочь и придирка, но всё же 5:4.

А ещё я постарался посмотреть на всё это с точки зрения «а если бы я был совсем новичок». И пришёл к выводу, что убунту совсем не дружелюбнее дебиан, когда это касается русскоязычных пользователей. Вот, например, по умолчанию пользователь открывает браузер и попадает на сайт техподдержки. Так вот, страница на русском языке там всего одна. Я и по-английски читаю, а кому такую порекомендуешь? Почему на ней нет ссылки на русскую документацию? Не, уж лучше Debian, сайт не такой лощёный, но хоть по-русски куча информации, и найти легко. Да и переводы вроде «разбивка винта» в документации Debian обычно не встречаются. В общем, для русскоязычного пользователя, видимо, Debian в данный момент подходит лучше. Счёт 6:4 в пользу Debian, но арбитр был пристрастен.

Так что жду ненаглядного Lenny, и откатываюсь обратно :)

Update: допишу сюда же об апгрейде до «Бестрепетного тура» (Intrepid Ibex) и об использовании Palm в Убунту. В общем, в отношении апгрейда всё прошло нормально, только папки из закладок стали открываться «Анализатором использования дисков» (baobab). Вылечилось правкой файла ~/.local/share/applications/mimeapps.list, там должно быть inode/directory=nautilus-folder-handler.desktop;, а не что-то иное.

Синхронизация с палмом, как и использование GPS Garmin через GPS, тоже «сломалась» (да, я до сих пор пользуюсь палмом, Tungsten E2). Теперь вместо старого:
$ pilot-xfer -p /dev/ttyUSB0 --backup каталог/резервной/копии/
это делается так:
$ pilot-xfer -p usb: --backup каталог/резервной/копии/
ну и после этого как обычно жмём кнопку на палме.Б

PS. На днях, вероятно, опишу, как настроил планшет Wacom Bamboo Fun. Работает. Update: в Intrepid Ibex уже даже и драйвер собирать не надо, распознаётся, работает на ура (кроме стёрки и кнопок), даже теперь стало работать горячее подключение.

20081017

Обновление скрипта gpxplot

Недавно выкладывал скрипт для визуализации профилей и высоты в GPS треках. Хочу сообщить, что скрипт несколько подновил. В частности, в нём добавилась возможность уменьшать количество точек и возможность рисовать график средствами Google Charts.

Соответственно, сделал и онлайн-версию. Онлайн-версия, в отличие от полной не умеет строить профили высоты и скорости как функции времени. Результат же выглядит примерно так:


Исходники скрипта
Онлайн-версия