6 November 2014

Как использовать покадровую фотосъемку камерой GoPro для сервиса «Mapillary»

Global Positioning SystemsOpenStreetMapGeoinformation services
Translation
Tutorial
Original author: Amanzi
За прошедшие полгода выросла популярность web-сервиса «Mapillary»: загружено свыше полумиллиона фотографий, причём более 100 тысяч штук — только за последние 10 дней!

На первый взгляд кажется, что для этого дела пригоден только обычный смартфон. А что, если бы для сбора фотоснимков для «Mapillary» можно было использовать экшн-камеру, например, GoPro? Установленную на велосипед, шлем или даже автомобиль? Как оказалось, это возможно.

И вот на прошлой неделе я предпринял небольшую поездку и собрал около 1700 фотографий за полчаса, пользуясь функцией TimeLapse. На моей 32-гигабайтной SD-карточке это съело всего лишь 3,4 гигабайта. Я мог бы еще кататься более 4 часов и снял бы около 150 тысяч фотографий, прежде чем моя карточка памяти заполнилась бы полностью!

Однако, дело это не совсем тривиальное, поэтому, полагаю, нужно объяснить подробнее, как всё это делается. Главная проблема в том, что GoPro не содержит в себе GPS-приёмника. Как же картографический сервис узнает, где на карте отобразить фотографии? Мы сами должны передать ему эту информацию, поэтому придётся использовать отдельный GPS-приёмник. Лично я пользовался своим смартфоном HTC One — тем же самым, каким я пользовался раньше, чтобы делать обычные фотографии для «Mapillary».

Вкратце, процедура такова:
  • Укрепить камеру на велосипеде или автомобиле с помощью разнообразных крепёжных приспособлений.
  • Запустить программу для записи GPS-трека. Я пользовался программой geopaparazzi, но есть и много других, которые работают не хуже.
  • Настроить GoPro на покадровую съёмку. Я выбрал настройки: 5MP, medium, narrow, 1s.
  • Запустить GoPro и кататься.
  • Выгрузить фотографии и трек GPX в компьютер.
  • Программой gpx2exif привязать фотографии к географическим координатам, синхронизируя время съёмки с GPX-треком.
  • Загрузить фотографии в Mapillary.

Вроде бы, выглядит не слишком трудным. Распишем эти действия более подробно на примере моей поездки на прошлой неделе.

image

Я закрепил GoPro на переднее левое крыло моей Mazda RX8, чтобы получить хороший вид на середину дороги.

image

Затем я укрепил свой смартфон HTC One в салоне автомобиля на специальный крепёж. Пользуясь программой "GoPro App", я присоединился к камере и вывел на предварительный просмотр картинку местности, как её видит GoPro. Это удобно, но, на самом деле, не очень-то и нужно, т.к. с началом записи предварительный просмотр исчезнет. Необходимо только, чтобы смартфон находился в машине в том месте, где хорошо ловится сигнал GPS-спутников. Если вы пользуетесь приложением «GoPro App», потратьте немного времени, чтобы настроить время на камере: разница текущего времени на устройствах должна быть как можно меньше. Как вы увидите позже, вам придётся учесть разницу времени, чтобы выполнить синхронизацию трека и фото. И чем меньшую коррекцию придётся вносить, тем легче будет выполнить работу.

image

Проверим настройки камеры ещё раз: должен быть включен режим покадровой съёмки «time-lapse photos». Это легко проделать с помощью приложения GoPro App, но можно и на самой GoPro. Я выбрал 5MB, Medium, узкое поле зрения (Narrow), чтобы получить вид, похожий на тот, что я снимаю с помощью телефона. Эквивалентное фокусное расстояние (в пересчёте на 35-мм фотоаппарат) составит приблизительно 20 мм. Настройки GoPro по умолчанию предусматривают широкое поле зрения, с большими оптическими искажениями, поэтому в данной поездке я отказался от этого режима. Я планирую в другой статье описать другой сценарий, когда я делал фотографии для Mapillary из широкоугольного 4К-видеопотока. Это было сложнее, так что пока пропустим рассказ.

При выбранной настройке 1 кадр в секунду, расстояние между фотографиями составит 10—20 метров при скорости 40—80 км/ч. Рекомендация Mapillary про один кадр через каждые две секунды больше подходит для велосипеда, а я планирую, конечно, двигаться быстрее, чем на велосипеде!

Запустим приложение для записи GPS-трека. В данном случае я пользовался программой geopaparazzi. В этом приложении есть кнопка для старта записи. Я нажал эту кнопку и подтвердил предложенное имя файла для сохранения трека. ОК. Теперь всё готово. Остаётся только запустить съёмку, и вперёд!

image

Накатавшись, остановим запись на камере и на GPS-приёмнике. Вот теперь и начинается настоящая работа! Нам нужно выполнить геопривязку, прежде чем мы сможем загружать наш материал в Mapillary. В Geopaparazzi я экспортировал трек в GPX-файл и сам себе послал его по почте. Из GoPro я просто вытащил карточку и скопировал с неё фотографии на ноутбук.

Первое, что я захотел сделать — это посмотреть, как выглядела моя поездка. Я исполнил команду:

geotag -g väla_to_billesholm.gpx \
       -o väla_to_billesholm.png \
       -D 1 -s 2048x2048


В результате получилась неплохое изображение в высоком разрешении всей карты пути. заметьте использование опции -D, чтобы задать больший промежуток между маркерами на карте. Это необходимо, потому что geotag по умолчанию настроен на короткие треки, как, напимер, быстрая велопрогулка. На получившемся изображении видно время и положение ключевых точек поездки. Нужно укрупнить масштаб в нескольких характерных местах, где мы сможем вручную проверить совпадение времени на камере и GPS-приёмнике и поточнее определить погрешность часов между ними. На этапе синхронизации мы сможем скорректировать эту разницу, и важно определить её правильно.

Я исполнил команду:

geotag -R 20140505T12:39:00+02-20140505T12:41:00+02 \
       -g väla_to_billesholm.gpx \
       -o krop.png -D 0.1
, которая сгенерировала такую картинку:

image

Я могу отыскать фотографию, где я въезжаю под мост, и сверить показания часов.

image

Данные EXIF этой фотографии показывают, что она была сделана в 12:39:11. Рассматривая карту, видим, что мы проходили под тоннелем в 12:39:14. Таким образом, ошибка составляет 3 секунды. Можно использовать это значение в процессе геопривязки, но лучше сначала сверимся с другой фотографией.

image

Я сгенерировал карту пути через Мёрарп, потому что я смогу опознать такие объекты, как здания и перекрёстки. Не следует использовать перекрёстки, на которых вы останавливались (как, например, мой поворот направо). Ищите такие ориентиры, рядом с которыми вы находились в движении. Я искал первый проезд справа, вверху карты, и нашёл фотографию, снятую в 12:46:10.

image

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

Еще один интересный способ проверки, которым также можно воспользоваться — если вы находились в месте, где есть снимки Google street view, можно сопоставить два изображения.

image

На снимках Google street view видно дорожный знак, разметку на перекрестке, дерево и столб освещения. Но заметьте, что нет забора, вместо него растут ёлки. Ясно, что строительство началось уже после того, как в этом месте проехал автомобиль Google. Google говорит, что снимок сделан в сентябре 2011 года — примерно 2,5 года назад — конечно, что-то поменялось.

Из данных трека GPX через Мёрарп видно, что перекрёсток прошли в 12:46:13, что на 3 секунды позже, чем зафиксировано камерой на фотографии. И снова мы имеем ошибку в 3 секунды. Это радует: получается, на протяжении всего трека ошибка одинакова. Можно продолжить и синхронизировать все 1500 фотографий, используя команду:

geotag -g väla_to_billesholm.gpx \
       20140505_TimeLapse/*JPG -t 3 -v


Я задал сдвиг времени с помощью опции "-t -3" и воспользовался опцией "-v", чтобы наблюдать за процессом. Поскольку скрипт представляет собой обёртку над программой для командной строки «exif_file», несколько процессов стартуют на обработке каждого файла; это занимает некоторое время, но в конце все ваши фотографии будут содержать информацию для геопривязки, взятую из GPX.

image

Когда привязка геоинформации к фотографиям завершилась, можно загрузить фотографии на mapillary.com. Войдите на сайт, нажмите на вашем имени, выберите «Upload images», нажмите кнопку «Choose files». Выбрав все файлы, прокрутите страницу вниз и нажмите кнопку «Start Uploading». Цветовая гамма на сайте такова, что не всегда понятно, началась ли загрузка. Просто прокрутите страницу вверх, и вы увидите красные индикаторы загрузки под каждым изображением.

image

И наконец, когда загрузка завершится, нажмите на ваше имя, выберите «my uploads»', и вы увидите новые изображения для вашего трека.

image

Нажмите на вашу последнюю загрузку, чтобы просмотреть фотографии в Mapillary!

image

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

А теперь — замедленная видеосъёмка

Настройки в GoPro для описанного способа фотографирования не зря называются «Time Lapse» — «замедленная съёмка». Из фотографий можно сделать видеофильм. Поскольку мы снимали один кадр в секунду — если мы сделаем видео с частотой 25 кадров в секунду, мы получим 25-кратное ускорение. Это же здорово! Посмотрите, что у меня получилось:



Это видео делалось так::
  • Переименуем все фотографии, чтобы имена файлов имели номера, начиная с 0000. Я задал имена подобные foo-0000.jpeg. Чтобы облегчить себе жизнь, я написал ruby-скрипт, которые создаёт жёсткие ссылки с необходимыми именами. Затем можно воспользоваться командой ffmpeg, чтобы собрать видеофильм:

    ffmpeg -f image2 -i foo-%04d.jpeg \
           -r 25 -s 1280x960 ../myvid.mp4
    

  • Эта команда сжимает 7-мегапиксельные фотографии формата 4:3 в видеофильм с чёткостью 960p HD.
  • Затем я с помощью видеоредактора OpenShot выполнил обрезку до 16:9, добавил звук, добавил карту и пережал в разрешение 720p со средним качеством для более быстрой закачки в web.


Установка gpx2exif

В этой статье широко использовалась команда geotag. Эта команда включена в ruby gem «gpx2exif». В статье использовались возможности, имеющиеся в версии 0.3.6. Однако, на момент публикации статьи была доступна версия 0.3.1. Поэтому объясню, как установить свежую версию.

Установка Ruby на Ubuntu

Первое, что понадобится — это Ruby. Установка зависит от операционной системы. Я пользуюсь Ubuntu 14.04 и RVM, здесь я дам инструкции, подходящие к моей OS. А вам я рекомендую сходить на сайты ruby-lang.org и rvm.io за советом, подходящим для вашей платформы.

sudo apt-get install curl
curl -sSL https://get.rvm.io | sudo bash -s stable --ruby
sudo usermod -g rvm craig
# logout and login to get RVM group
source /etc/profile.d/rvm.sh

Часть программы, которая создаёт изображения в формате PNG, использует для своей работы ImageMagick. Применительно к Ubuntu это означает, что нужно сначала установить несколько зависимостей:

sudo apt-get install imagemagick imagemagick-doc libmagickwand-dev
gem install rmagick # Requires libmagickwand-dev to compile


Установка из rubygems.org

Когда ruby установлен, просто инсталлируйте gem:
gem install gpx2exif

Затем выведите список командой «gem list», чтобы узнать, какая версия установилась в результате. Если она старше, чем 0.3.5, то следуйте инструкциям ниже.

Установка с github

Установите git, а затем исполните команды:

git clone https://github.com/craigtaverner/gpx2exif
cd gpx2exif
bundle install
rake build
gem install pkg/gpx2exif-0.3.6.gem

Если всё прошло удачно, значит, вы собрали и установили самый свежую версию Ruby Gem.

Замечания от переводчика:
1) Что такое «Mapillary»? Как выразился Zverik: «Mapillary для снимков — как OpenStreetMap для карт». Если говорить коротко, то это аналог Google street view и Яндекс-панорам, работающий по принципу краудсорсинга. Пользователи загружают свои геопривязанные фотографии, которые затем отображаются на карте вместе с линией пройденного пути. Лицензия на контент разрешает использовать информацию, полученную с фотографий, в OpenStreetMap.
2) Для геопривязки фотографий есть ещё такой скрипт на Python'е: https://github.com/mapillary/mapillary_tools/blob/master/python/geotag_from_gpx.py
3) Про всё, упомянутое в пунктах 1 и 2, я узнал из статьи "Народные панорамы" в блоге пользователя Zverik.
4) Самый удобный способ зафиксировать расхождение в показаниях часов — сфотографировать камерой показания часов на GPS-устройстве.
Tags:MapillaryGoProaction cam
Hubs: Global Positioning Systems OpenStreetMap Geoinformation services
+26
30.4k 86
Comments 23
Top of the last 24 hours