За прошедшие полгода выросла популярность 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.
Вроде бы, выглядит не слишком трудным. Распишем эти действия более подробно на примере моей поездки на прошлой неделе.
Я закрепил GoPro на переднее левое крыло моей Mazda RX8, чтобы получить хороший вид на середину дороги.
Затем я укрепил свой смартфон HTC One в салоне автомобиля на специальный крепёж. Пользуясь программой "GoPro App", я присоединился к камере и вывел на предварительный просмотр картинку местности, как её видит GoPro. Это удобно, но, на самом деле, не очень-то и нужно, т.к. с началом записи предварительный просмотр исчезнет. Необходимо только, чтобы смартфон находился в машине в том месте, где хорошо ловится сигнал GPS-спутников. Если вы пользуетесь приложением «GoPro App», потратьте немного времени, чтобы настроить время на камере: разница текущего времени на устройствах должна быть как можно меньше. Как вы увидите позже, вам придётся учесть разницу времени, чтобы выполнить синхронизацию трека и фото. И чем меньшую коррекцию придётся вносить, тем легче будет выполнить работу.
Проверим настройки камеры ещё раз: должен быть включен режим покадровой съёмки «time-lapse photos». Это легко проделать с помощью приложения GoPro App, но можно и на самой GoPro. Я выбрал 5MB, Medium, узкое поле зрения (Narrow), чтобы получить вид, похожий на тот, что я снимаю с помощью телефона. Эквивалентное фокусное расстояние (в пересчёте на 35-мм фотоаппарат) составит приблизительно 20 мм. Настройки GoPro по умолчанию предусматривают широкое поле зрения, с большими оптическими искажениями, поэтому в данной поездке я отказался от этого режима. Я планирую в другой статье описать другой сценарий, когда я делал фотографии для Mapillary из широкоугольного 4К-видеопотока. Это было сложнее, так что пока пропустим рассказ.
При выбранной настройке 1 кадр в секунду, расстояние между фотографиями составит 10—20 метров при скорости 40—80 км/ч. Рекомендация Mapillary про один кадр за две секунды больше подходит для велосипеда, а я планирую, конечно, двигаться быстрее, чем на велосипеде!
Запустим приложение для записи GPS-трека. В данном случае я пользовался программой geopaparazzi. В этом приложении есть кнопка для старта записи. Я нажал эту кнопку и подтвердил предложенное имя файла для сохранения трека. ОК. Теперь всё готово. Остаётся только запустить съёмку, и вперёд!
Накатавшись, остановим запись на камере и на 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
, которая сгенерировала такую картинку:
Я могу отыскать фотографию, где я въезжаю под мост, и сверить показания часов.
Данные EXIF этой фотографии показывают, что она была сделана в 12:39:11. Рассматривая карту, видим, что мы проходили под тоннелем в 12:39:14. Таким образом, ошибка составляет 3 секунды. Можно использовать это значение в процессе геопривязки, но лучше сначала сверимся с другой фотографией.
Я сгенерировал карту пути через Мёрарп, потому что я смогу опознать такие объекты, как здания и перекрёстки. Не следует использовать перекрёстки, на которых вы останавливались (как, например, мой поворот направо). Ищите такие ориентиры, рядом с которыми вы находились в движении. Я искал первый проезд справа, вверху карты, и нашёл фотографию, снятую в 12:46:10.
Я взял на заметку несколько ориентиров, про которые я точно знаю, где они находятся: предупреждающий знак посередине, белая разметка у перекрёстка, столб уличного освещения.
Еще один интересный способ проверки, которым также можно воспользоваться — если вы находились в месте, где есть снимки Google street view, можно сопоставить два изображения.
На снимках 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.
Когда привязка геоинформации к фотографиям завершилась, можно загрузить фотографии на mapillary.com. Войдите на сайт, нажмите на вашем имени, выберите «Upload images», нажмите кнопку «Choose files». Выбрав все файлы, прокрутите страницу вниз и нажмите кнопку «Start Uploading». Цветовая гамма на сайте такова, что не всегда понятно, началась ли загрузка. Просто прокрутите страницу вверх, и вы увидите красные индикаторы загрузки под каждым изображением.
И наконец, когда загрузка завершится, нажмите на ваше имя, выберите «my uploads»', и вы увидите новые изображения для вашего трека.
Нажмите на вашу последнюю загрузку, чтобы просмотреть фотографии в Mapillary!
Полная обработка фотографий может занять некоторое время, поэтому не пугайтесь, если они не будут доступны сразу. Вернитесь к ним чуть позже.
А теперь — замедленная видеосъёмка
Настройки в 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. Поэтому объясню, как установить свежую версию.
Installing Ruby on 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-устройстве.
Автор: surly