Панорамки на StereoPi

    image

    Продолжаем эксперименты с Raspberry Pi, оснащенной двумя камерами одновременно. Напомню, что все игрища происходят вокруг Raspberry Pi Compute Module 3 Lite, вставленном в «кроватку» StereoPi.

    В прошлых обзорах мы устанавливали камеры параллельно и работали со стереоэффектом. Здесь же подход ровно обратный: камеры смотрят в разные стороны, но оснащены широкоугольными объективами (200 градусов). И мы будем склеивать сферическую панораму 360 градусов!

    Вводная


    Отвлечение: так как на Хабре нету соавторства статей, то упомяну основное текстом. Данный эксперимент проводился совместно, с меня — железо и эксперименты в поле, а с @Gol — софтовая часть.

    Начнем с конца: вот результат, собственно панорама.

    Итак, на этот раз, попробуем сделать сферическую панораму. Зря, что-ли, у нас две камеры на борту. Конечно, можно было две камеры подключить и к обычной малине, в режиме мультиплексирования (то одна камера работает, то другая, выбор нужной — через GPIO). Но тогда кадры будут сниматься последовательно, а при наличии движения это не очень гут. Правда, при «одновременной» съёмке с двух камер стереопишки тоже синхронизации нет никакой, тупо два raspistill одновременно запускаются. Но тут больше шансов что объекты на границе шибко не разбегутся. Ещё и видео можно одновременно двумя камерами снимать, а потом в сферическую видеопанораму сшить. Но это я потом как-нибудь попробую, для начала надо с фото-панорамами разобраться.

    Железо


    Имеем StereoPi, есть две камеры с фишай объективом (200 градусов). Вот такие камеры: RPi Camera (M) WaveShare

    Располагаем две камеры попа-к-попе:

    image

    Делаем фото с обеих камер. В идеале — одновременно, но можно и поочерёдно. raspistill нам в помощь. Получаем вот такие две картинки:

    image
    Полный размер

    image
    Полный размер

    Сшивание панорамы


    Далее встала проблема — как из этих двух фишайных картинок автоматически сделать картинку с эквидистантной проекцией, которую кушают практически все просмотрщики панорам. Преобразование хочется делать прям на борту стереопишки, без использования специального панорамного софта.

    После долгих изысканий был найден проект 360-camera, откуда и были взяты за основу скрипты.

    Но сначала нам таки придётся воспользоваться отдельной панорамной прогой, чтобы подготовить шаблон для преобразования. Прога называется Hugin, скачать можно вот тут http://hugin.sourceforge.net/download/

    1. Итак, скачали, установили, запустили.
    2. Выбираем в меню «Интерфейс» вариант «Simple».

    image

    3. Жмём кнопку «Загрузить снимки...» и добавляем два наших файла (21.jpg и 21-2.jpg).

    image

    4. Задаём «Тип объектива» — «Круговой ВырвиГлаз». «Фокусное расстояние» 1,2mm и «Множитель фокусного расстояния» 7,6x. А во вкладке «Проекция» убеждаемся что стоит поле зрения 360х180 и «Эквидистантная». По дефолту так оно и должно быть.

    image

    5. Жмём кнопку «2. Выровнять...». Начнётся поиск контрольных точек, должно найтись где-то 10-13 точек. Панорамка уже начинает быть похожа на панорамку.

    image

    6. Теперь самое главное — сохранить проект, так как именно он нам потребуется для последующей автоматической склейки всех последующих панорам, снятых этими нашими двумя фишайными камерами. «Файл» -> «Сохранить как» -> имя файла stereopi-template.pto

    7. Возвращаемся во вкладку «Ассистент» (если мы вдруг оттуда уходили) и жмём «Создать панораму...» Откроется дополнительное окно, там выбираем высоту 1944, ширина сама высчитается. LDR Формат (формат картинки на выходе) задаём JPEG. Качество — какое хотите, по дефолту — 90. Коррекции не трогаем пока. Жмём ОК. Задаём имя файла с результатом. И жмём «Сохранить».

    image

    8. Откроется ещё пара окон, в одном из которых будет отображаться лог процесса.

    image

    9. В итоге получится вот примерно такая картинка:

    image

    Полный размер

    Это и есть необходимая нам эквидистантная проекция нашей сферической панорамы!

    Переносим сшивание на борт


    Но это всё лирика!

    Мы-то хотим не париться с каждой фоткой, нам нужно сей процесс автоматизировать. Для этого и понадобится файл проекта, который мы сохранили на пункте 6. Берём наш файл проекта (у меня это stereopi-template.pto) и копируем на стереопишку.

    Туда же копируем скрипт склейки stereopi-stich.sh Скрипту нужно два входных параметра — имена файлов фишайных фоток которые надо склеить в эквидистантную проекцию.

    Но сначала надо установить на стереопишку весь необходимый софт. Просто скачиваем этот скрипт и на стеропишке запускаем. installer.sh

    Теперь прогоняем скрипт склейки:

    # ./stereopi-stich.sh 21.jpg 21-2.jpg
    Stiching files 21.jpg and 21-2.jpg
    Generating pto file...
    Reading /opt/Pano/test1/21-2.jpg...
    Reading /opt/Pano/test1/21.jpg...
    
    Assigned 1 lenses.
    
    Written output to /opt/Pano/test1/tmp/project.pto
    
    Written output to ./tmp/project.pto
    number of cmdline args: 1
    ==================================
    Stitching panorama
    ==================================
    nona -z LZW -r ldr -m TIFF_m -o 21_21-2-pano -i 0 ./tmp/project.pto
    nona -z LZW -r ldr -m TIFF_m -o 21_21-2-pano -i 1 ./tmp/project.pto
    checkpto --generate-argfile= project.pto_21_21-2-pano.arg ./tmp/project.pto
    enblend --compression=90 -w -f2688x1344 -o 21_21-2-pano.jpg -- 21_21-2-pano0000.tif 21_21-2-pano0001.tif
    enblend: info: loading next image: 21_21-2-pano0000.tif 1/1
    enblend: info: loading next image: 21_21-2-pano0001.tif 1/1
    enblend: info: writing final output
    Bogus input colorspace
    exiftool -overwrite_original_in_place -TagsFromFile /opt/Pano/test1/21-2.jpg -WhitePoint -ColorSpace -@ /usr/share/hugin/data/hugin_exiftool_copy.arg -@ project.pto_21_21-2-pano.arg 21_21-2-pano.jpg
    1 image files updated
    ==================================
    Remove temporary files
    ==================================
    rm project.pto_21_21-2-pano.arg 21_21-2-pano0000.tif 21_21-2-pano0001.tif

    Процесс занимает около 50 секунд. Надо бы будет поискать возможности оптимизации, но пока и так неплохо.

    В результате получится файл

    image

    Полный размер

    Всё! Мы автоматически склеили два фишая в эквидистантку! И этим же скриптом можно склеивать и все последующие фотки, главное чтобы взаимное размещение наших камер шибко не менялось, а то склейка поедет.

    Теперь нужно его впендюрить куда-нибудь на сайт. Для просмотра нашей панорамы на сайте нужен панорамный плеер.

    Имхо, лучший встраиваемый плеер для панорам — KRPano. Могёт и фото, и видео. Да, платный. Я лицензию на него уже покупал лет пять назад, но тогда плеер был на флеше сделан и HTML5 не умел. А теперь умеет, но надо заново лицензию покупать.

    Можно скачать мой архивчик, где внутри уже всё что нужно чтобы увидеть вот такое. Самый ништяк — литтл планет (выбор режима просмотра — клик правой кнопкой мыши).

    image

    Надеемся, что наш эксперимент будет вам не только интересен, но и полезен в качестве рецепта. Спасибо за внимание!

    Полезные ссылки:


    Эквиректангулярная проекция
    Много теории по фишаям и эквидистантной проекции
    Софт для просмотра панорам
    Большой мануал по автоматической склейке
    BrianBock/360-camera
    Поделиться публикацией

    Похожие публикации

    Комментарии 10

      0
      это open-source Ricoh Theta / Xiaomi Mi Sphere?
        0

        А тут в топике вы видели хоть одно упоминание этих девайсов???

          +1

          А, имелось в виду что это опенсурс аналог для теты и мисферы? Тогда да.

          +1

          ещё два года назад попробовал Panellum.
          пользуюсь с удовольствием. бесплатная.

            +1

            Очень интересно, спасибо.

              0
              Скажите, а Вы рассматривали варианты стабилизации изображения/видео? С помощью данных с IMU или каким-то алгоритмом вычислять?
                0
                Ну тут мы с фото работали, а не с видео, поэтому такой потребности не возникло. В прикладных задачах на дронах стабилизация обычно не только цифровая но и механическая, не говоря уже про виброразвязку. Так что если до 360 видео руки дойдут — озадачимся. Сейчас к краудфандингу готовимся, на всё сразу времени не хватает. {smile}
                0
                А существуют ли панорамные камеры (не fish eye) в уличном исполнении? Никак не могу найти камеру на ~180 градусов… сплошной фиш ай, но это не то. Мне нужно три камеры одной заменить (для контроля горизонта — слева, справа и по прямой)
                  0
                  Ну у вас видимо совсем специфическая задача. Я не гуру в фотографии на зеркалки, но слышал, что для широкоугольных объективов есть насадки которые компенсируют бочкообразную дисторсию — получается нефишайный ширик. И компенсация не постфактумная софтовая, а именно оптическая.
                  0
                  Встречалось на просторах про одного чела, снимавшего одной камерой, направленной снизу вверх на сферическое зеркало.

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

                  Самое читаемое