Специалист по БД
0,0
рейтинг
6 ноября 2014 в 15:50

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

За прошедшие полгода выросла популярность 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-устройстве.
Перевод: Amanzi
@surly
карма
5,0
рейтинг 0,0
Специалист по БД
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (23)

  • +1
    Замечу, что быстрее и точнее можно привязать фотографии в редакторе JOSM: открыть трек, добавить слои OSM и Bing/Mapbox, затем правую кнопку мыши на слое GPX, «загрузить изображения». Для сохранения координат в EXIF понадобится плагин photo_geotagging.

    Записи с видеорегистратора, у которого нет таймлапса, несложно разбить на картинку с помощью того же ffmpeg (не знаю конкретных параметров).
    • 0
      Точнее не получится, в josm шаг смещения между временем трекера и временем камеры кратен 1 секунде. gpx2exif позволяет задавать смещения в доли секунды. Понимаю, это не сильно актуально для велика, но на авто из-за такой дискретности промахи значительные
      • 0
        В EXIF поле DateTimeOriginal в любом случае имеет формат YYYY:MM:DD HH:MM:SS и это ASCII-строка, запихнуть туда что-то точнее секунд — нельзя.
        Так что несмотря на формат YYYY-MM-DDTHH:MM:SS.SSSZ в GPX, любая картинка, в какой бы момент относительно целой секунды по UTC она ни была снята, окажется привязана к точке трека с целым значением секунд.

        Потому для высокой точности совпадения панорам либо затвор должен быть синхронизирован с GPS по времени, либо снимать нужно с частотой, которая превышает 1Гц во столько раз, чтобы расстояние, проходимое средством передвижения с камерой за промежуток между кадрами, было меньше или равно допустимой величине ошибки в привязке.
        • 0
          Хорошо, ошибка камеры в дискретной привязке снимка ко времени неустранима, но остается же еще разница между часами трекера и часами камеры — вот она может быть выражена в долях секунды. Иначе мы имеем ошибку камеры (до половины секунды) + ошибку смещения (до половины секунды).
          • 0
            Разница между часами GPS и часами камеры может составлять долю секунды, это совершенно верно.

            Но даже если мы будем знать, что она составляет, скажем, 0.4 секунды, мы все равно не сможем сообщить об этом сервису Mapillary, сдвинув время в EXIF на эту величину, потому что EXIF хранит только целые секунды.

            Единственный путь в этом случае — снимать с частотой, скажем, пять кадров в секунду, а потом выбирать (используя способ со съемкой экрана приемника, показывающего часы) один снимок из пяти с одинаковым временем в EXIF, вычислив, какой из них максимально близко расположен к целому значению секунд GPS-времени и присваивая ему координаты, которые извлечены из трека или вычислены по нему интерполяцией.

            Именно потому, что дискретность координаты времени в EXIF неустранима, мы должны пытаться сделать сам снимок ближе к целому значению секунд (что, как я сказал выше, достигается либо синхронизацией затвора, либо повышением частоты кадров и выборкой из получившихся тех, которые ближе всего к искомому моменту).
            • 0
              мы сможем сообщить об этом сервису Mapillary, но только не сдвинув время в exif, а выставив координаты снимка с учетом этой 0.4 секунды
    • 0
      Подскажите, пожалуйста, как сделать такую задачу:

      Есть трек без времени. Есть информация о времени начала трека и времени конца трека. Нужно проставить время для промежуточных точек трека (по средней скорости).

      Суть в том, что есть фото, сделанные в путешествии, есть планируемый трек, а вот трек реальный был потерян. Теперь предстоит задача разбросать фото по треку.
  • –2
    А я для склейки таймлапсов в GoPro использую AMVSimple GUI, хоть она и не совсем для этой задачи:
    amvnews.ru/index.php?go=Pages&in=view&id=34

    Драг энд дроп первого кадра на окно, выбираешь FPS, ставишь на deluxe, жмешь Run и все через несколько минут готовый MP4 файлик.
  • 0
    А видео чем-то дополнительно стабилизировалось?
    • +21
      Целевым использованием бюджета на строительство дорог.
  • 0
    Я так понимаю ошибка во времени просто от рассинхронизации камеры и смарта? Можно ведь просто синхронизировать время до записи, или я не так понял?
    • +1
      Правильно. Но абсолютно точно синхронизировать часы не всегда легко получается. Всё зависит от того, позволяет ли настройка времени на камере остановить часы и запустить их точно в момент подтверждения. И еще от скорости реакции пользователя. Ошибка в несколько секунд типична в подобных ситуациях.
      • 0
        Касательно гопро в приложении есть синхронизация, но я не проверять насколько идеально точно она время выставляет.

        Кстати спасибо за наводку, попробую теперь рациональнее использовать камеру на веле)
      • +2
        Для сдвига времени в EXIF-заголовках всех файлов серии с шагом, кратным секунде, можно использовать программу jhead с опцией -ta.

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

        Еще более гибкие и эффективные методы синхронизации предлагает ExifTool.
  • 0
    О! Вот это красота.

    Пять лет назад, сделать подобную регистрацию на базе PocketPC для картографирования районов, обошлось мне во много усилий. Можно оценить технологический прогресс по качеству полученного результата: www.youtube.com/watch?v=naT7cft52r8

    За 5 лет прогресс весьма хорош, совсем другой уровень качества на выходе!
    Движемся к светлому будущему :)
  • +2
    Жаль, что перевод. Хотелось бы узнать у автора, что за крепление для смартфона такое, что не отваливается от рифлёной приборной панели.
    • 0
      вполне возможно что какой-нить «злой» двусторонний скотч от 3М, который отдирается только с этой самой панелью.
    • 0
      Судя по «хвостику» на правом краю крепежа, это устройство с присоской. Я себе в салоне таким же образом укрепляю туристский Garmin. В комплект автомобильного крепежа входит гладкий пластмассовый кругляш со скотчем. Скотч достаточно могучий. Несмотря на небольшое рифление приборной панели и выпуклость, кругляш приклеился намертво. Но для надежности я, когда приклеил его, сразу положил груз и оставил его лежать сутки. В роли груза была коробка с дрелью.
    • 0
      Это фирменное крепление HTC.
      image
      • 0
        Судя по описанию с сайта, комплекте идёт Dash Mount Pad, как написал surly. Буду искать аналог и прекращаю оффтопить. Спасибо.
  • +1
    И это, «time lapse» не переводится с английского, как «замедленная съемка» (и уж если на то пошло — она обычно получается не замедленная, а ускоренная, потому что частота кадров при съемке меньше частоты при воспроизведении, а не наоборот) — это «интервальная съемка».
    • 0
      она обычно получается не замедленная, а ускоренная, потому что частота кадров при съемке меньше частоты при воспроизведении

      Правильно отмечено, что частота кадров при съемкеменьше частоты воспроизведении. Именно поэтому такой вид съёмки и называется замедленной съемкой. При воспроизведении же возникает впечатление убыстренной окружающей жизни.

      По поводу перевода «time lapse» — да, можно еще перевести как «покадровая съёмка», «интервальная съемка». Но Мультитран подсказывает ( http://www.multitran.ru/c/m.exe?a=3&&s=time%20lapse&sc=128&l1=1&l2=2, http://www.multitran.ru/c/m.exe?a=3&s=time%20lapse&sc=91&l1=1&l2=2), что «замедленная съемка» — тоже общепринятый перевод этого термина. Перенаправления в Википедии между статьями RU: Замедленная_киносъёмка и EN:Time-lapse_photography подтверждают это мнение. Так что, извините, но вынужден не согласиться с вашим возражением.
      • 0
        Есть нормальные термины, исключающие кривотолки «рэйпид» это как в матрице, и «таймлэпс» это когдаоблака быстро летят.
        И все.

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