О съемке гигапиксельной панорамы Екатеринбурга

    В этой статье пойдет речь о создании панорамы Екатеринбурга.
    Публикация на Хабре: habrahabr.ru/post/150591 Сама панорама: ekburg.artstudio-3d.ru

    Изначально более подробный вариант статьи направлялся в «песочницу», но НЛО не счел его достойным инвайта. Ниже я опущу предысторию с тендерами и прочую «лирику», и постараюсь остановиться лишь на технической части.

    image



    В марте этого года был опубликован тендер на «изготовление панорамы города Екатеринбурга сверхвысокого (гигапиксельного) разрешения». Примерно сутки я обдумывал «смогу ли сделать эту работу если выиграю?». После положительного ответа на этот вопрос была подана котировочная заявка. Девушки в DHL были очень удивлены и пожелали удачи.
    Тендер выиграл. (Не буду вдаваться в подробности в этой статье, хотя опыт работы в фото по системе тендеров уже есть кое-какой. Может быть еще статью напишу. 3 тендера выиграно на данный момент.)

    Что нужно было снять?


    Цилиндрическую панораму вида на город с местной высотки.
    Разрешением не менее 10Gpx. А так же обычные панорамы 360х180 объектов по земле.

    В целом вменяемое ТЗ, хотя и не без бредовых требований. «5000 исходных кадров» избыточны для 10Gpx (если речь о рально разных, а не просто брекетинге).

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

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

    Доп. соглашение к контракту гласило, что объектов стало больше 10.
    «Екатеринбург — объекты» на Яндекс.Картах

    Расчеты


    Как я уже писал выше, прежде чем посылать заявку, нужно было убедиться в реальности реализации проекта. Да и просто понять «как это сделать?». К тому моменту я не снимал панорам подобного план. Лишь при съемке интерьеров использовал этот подход.

    Готовых «калькуляторов» я нагуглить не смог, хотя особо и не старался — важно было самому все понять.

    Поскольку в наличии из телеобъективов только 70-200/4L IS, то сначала расчет произвел для него.
    В качестве камер рассматривались: 5D m2, как фф, и 600D (60D) как самый плотнопиксельный кроп (из актуальных на момент расчета кэнонов).

    Внимание! Расчет ниже не претендует на 100% правильноть с точки зрения терминологии. Измерение «высоты кольца» в градусах — может повредить вашей психике. Просьба смотреть в суть, а не термины. Я таких расчетов уже 10 лет не делал.

    70-200 имеет угол в 12о по диагонали (фф, 200мм), т.о. углы для фф и кропа:
    фф: 9.99о по длинной стороне (3х) и 6.66о по короткой (2х);
    кроп: 6.24о по длинной стороне (3х) и 4.16о по короткой (2х);

    Для замыкания в 360о (кольцо без перекрытия) в теории нужно:
    фф: 36 кадров (360:9.99), при высоте кольца в 6.66о — т.е. 1\27 от 180о;
    кроп: 58 кадров (360:6.24), при высоте кольца в 4.16о — т.е. 1\44 от 180о.

    Для полной сферы (360ох180о) в теории:
    фф: 27 рядов по 36 кадров (972 кадра);
    кроп: 44 ряда по 58 кадров (2552 кадра).

    А в мегапикселях это:
    фф: 27 x 36 x 21mp = 20 412mp;
    кроп: 44 х 58 х 18mp = 45 936mp.

    Перейдем к реалиям с перекрытием (25%) на сшивку.
    Грубо уменьшим углы обзора, и будем дальше считать как бы без перекрытия:
    фф: 7.5о (9.99ох0.75) по длинной и 5о (6.66ох0.75) по короткой;
    кроп: 4.7о (6.24ох0.75) по длинной и 3.1о (4.16ох0.75) по короткой.

    Для замыкания в 360о нужно:
    фф: 48 кадров (360:7.5), при высоте кольца в 5о — т.е. 1\36 от 180о;
    кроп: 77 кадров (360:4.7), при высоте кольца в 3.1о — т.е. 1\58 от 180о;

    Итого, для полной сферы (360ох180о), с перекрытием в 25%:
    фф: 36 рядов по 48 кадров = 1728 кадров;
    кроп: 58 рядов по 77 кадра = 4466 кадров.

    Апофеоз:
    Пусть каждый кадр снимается до 1сек. (день же), и 3сек. уходит на перепозиционирование головы:
    фф: 1728х4 = 1.9 часа (примерно 39Gb RAW-файлов);
    кроп: 4466х4 = 4.9 часа (примерно 98Gb RAW-файлов);

    Но это полная сфера, что бессмысленно (зачем нам небо и крыша здания с которого снимать?).
    Пусть высота будет не 180о, а 60о:
    фф: 576 кадров, 0.65 часа, 6.8Gpx;
    кроп: 1448 кадров, 1.6 часа, 15.3Gpx.


    Вывод? Спокойно можно снимать на 200mm и 18mp кроп-камеру.

    Забегая вперед скажу, что расчеты неплохо подтвердились практикой.
    После калибровки штативной головы «на месте» расхождения теорией составили 0.1-0.2о на кадр.

    Чем работать?


    Уже определился, что снимать на кроп-камеру о 18mp и 200mm объектив.
    По условиям контракта съемка должна производиться с использованием «роботизированной штативной головы».
    Хотя и можно снять 1450 кадров в ручном режиме, выбор, все же, пал на Gigapan EPIC Pro.
    image

    Ну а с наземными сферическими панорамами все просто: 5D m2 + 15mm. По схеме «2 ряда по 8 кадров». Это дает большое перекрытие, что поможет избавляться от призраков и половинок автобусов.

    Если обычные сферические панорамы я уже привык (сшивать «потом, дома»), то гигапиксельный вид нужно проверить прямо в Екатеринбурге. Для этого был куплен нетбук следующей конфигурации: i7-2670QM / 16Gb RAM / 128Gb SSD / 640Gb HDD.

    В Екатеринбурге


    Наверное, и правда, не стоит писать об этом тут. Оставлю в жж. Всего в городе провел 5 дней. День ушел на тесты и пристреливания на крыше высотки, день на съемку, и еще 3 дня на городские виды «по земле».

    Панорама же была снята 16го мая 2012 года.

    На крыше


    Что нужно учитывать в первую очередь?
    • Погоду и ее прогноз на ближайшее время. Недопустима резкая перемена освещенности. Нежелательны облака – будет каша.
    • Влажность – чем выше она выше, тем сильнее будет муар и хуже видимость.
    • Высоту солнца над горизонтом – чем выше, тем лучше.
    • Время съемки – снимать надо максимально быстро, иначе тени уползут и не сошьются.
    • Ветер был порывистый, пришлось снять бленду с объектива, для уменьшения площади паруса.


    image
    Фотографы тоже снимают телефонами. Первый день, тесты.

    Как снимать?
    • Рядами сверху вниз. Так уменьшается количество «призраков» возникающих при сшивке.
    • Фокус – руками, с перефокусировкой каждые несколько рядов. Иногда это давало сбои (есть мыльные участки), но что поделать.
    • Режим – Av. М, при съемке такого числа кадров, не имеет смысла. Разбег освещенностей ни в одну матрицу по ДД не влезет.
    • Тесты показали, что экспокоррекция, в целом, не нужна, но желательна эксповилка.
    • Само собой в RAW. Меняя флешки и сразу отсматривая материал.


    Обработка материала


    Опишу процесс работы над большой панорамой.

    Нужно отобрать кадры, предварительно сконвертировать.
    Затем собрать тестовую панораму, проверить ее на корректность сшивки.

    Потом начинается самое нудное – нужно обрабатывать конкретные кадры и группы кадров. Что бы не было полос и перепадов яркости да цвета. Подменять кадры и смотреть на результат. В рядах кадров «неба» — очень много замен. И так много раз по кругу.

    После того как цвет был выровнен я приступил к борьбе с «призраками» (людьми без голов, половинками машин, двухколесными автобусами). Это делается масками в PTGui, а иногда и ретушью в фотошопе. Эти операции так же повторялись многократно.

    Если говорить о времени сшивки и нарезки изображений на тайлы (KRPano), то цифры, в среднем для каждого сектора, такие:

    расстановка контрольных точек (автоматом) – 30-40 минут;
    сшивка панорамы – 2-2.5 часа;
    нарезка на тайлы – 1.5 часа;

    Последние два пункта повторялись очень много раз. Окончательные правки вносились уже после предварительной публикации панорамы и обсуждения ее зрителями. И даже после этого — минимум пара призраков остались. Всего ушло примерно 3-4 недели.

    Самым неприятным было применять кривые к двум из трех панорам (секторов). Для файлов в 5-7 гигапикселей и 20 гигабайт операции «открыть, применить кривые, повысить контраст, сохранить, закрыть» занимали по 2-3 часа.

    Статистика отснятого


    Было отснято 3 панорамы:
    1. 19 рядов по 36 кадров – итого 684 уникальных (без учета брекетинга);
    время съемки: 34 минуты;
    угловые размеры: 160о по горизонту и примерно 55о по вертикали;
    размеры сшитой простыни: 127 800 х 54 850 px, примерно 7 Gpx.

    2. 15 рядов по 36 кадров – или 540шт;
    время съемки: 31 минута;
    угловые размеры: 160о по горизонту и примерно 40о по вертикали;
    размеры сшитой простыни: 131 175 х 37 922 px, примерно 5 Gpx.

    3. 16 рядов по 34 кадра – или 544шт;
    время съемки: 31 минута;
    угловые размеры: 155о по горизонту и примерно 47о по вертикали;
    размеры сшитой простыни: 122 400 х 43 800 px, примерно 5.4 Gpx.

    В общем, очень близко к расчетам.

    Почему 3 сектора, а не единый цилиндр?
    Не позволяет конфигурация крыши. При такой относительно небольшой высоте (43 этажа?) точки съемки слишком сильно разнесены друг от друга. Параллакс велик. Была попытка собрать, если не в единый цилиндр, то хотя бы в 2 сектора. Не вышло. На «пограничных территориях» доходило до того, что у одного и того же небольшого здания на одной панораме я видел как бы левую стену, а на другой чуть ли не правую.

    Благодарности


    Хочу сказать спасибо людям оказавшим мне помощь в реализации данного проекта:
    Алексей Крылов, г. Москва;
    Антон Фадеев, г. Екатеринбург;
    Владимир Барданос, г. Новокузнецк;
    Родион Галанев, г. Москва.

    Что в итоге?


    Опыт интересной работы.
    Довольно неплохая визуализация Екатеринбурга.

    О самой же панораме судить вам:

    image
    Екатеринбург: гигапиксельная панорама и виртуальный тур (кликабельно)

    Конструктивная критика — приветствуется.
    При смене обзора в адресной строке браузера меняются данные, т.о. можно давать ссылки на конкретные виды.

    UPD:
    Отретушировал большую часть из указанного в комментариях.
    Файлы обновил.
    Копию администрации заказчика передал.
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 58

      0
      Круто. А почему некоторые здания кажуться кривыми? Это так склеилось?
        0
        Можно пример? Копипасту из адресной строки браузера с «кривыми» зданиями на экране.

        Подозреваю, что дело в стандартном эффекте при проекции (сектора)сферы на плоскость. С небоскребом вдали видно явно — если он в центре окна просмотра, то прямой, а если скраю — то наклонен.

        В общем так и должно быть. А сшито все весьма ровно.
            0
            Ах вот о чем речь!
            Вспомнил. Сам очень долго голову ломал, с коллегами советовался.

            На исходной панораме (простыня этого вида) — все строго прямо, ровно, перпендикулярно, параллельно. А на проекции, разрезанной на тайлы — вот так.

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

            Мой английский не позволил однозначно и понятно описать это на форуме разработчика. Надо заняться.
              0
              это потому, что ваша панорама сделана старой версией krpano, у которой по-умолчанию батники были настроены так, что разрезали картинку в проекцию «сфера». нажмите на клавишу 'o' а затем таб при просмотре панорамы — увидите сетку.
              да и тормозит сфера больше чем куб.
                0
                У меня тоже есть мысли перешить на 15й версии. Но пока некогда.
                Но тут нет сферы. Это цилиндр.
                  0
                  и всё-же, сетка от сферы.
              0
              Наверное дело в искажении оптики, потому как эффект заметен только с близкими зданиями.
                0
                Не соглашусь. Посмотрите внимательнее в разных степенях «приближения». Эффект плавает.
                  0
                  Согласен, похоже что движок мудрит.
                0
                Аналогично.
                Причем, если «приблизить» (2-3 раза нажать на кнопку "+"), то видно, что «волна» смещается в другое место.
                А если приблизить еще сильнее и «осмотреть всю стену сверху до низу», то видно, что она прямая.

                Не знаю, что с этим делать. Кроме как написать разработчику баг-репорт.

                astana.kz/sites/all/themes/astana/giga/1/index.html
                На этой панораме, на небоскребе с темно-синим (стеклянным) фасадом – похожий эффект. Сначала показался браком, а как присмотрелся – ровно.
              0
              Это следствие небольшого количества полигонов сферы, на которую натягивется панорама. При увеличении кол. полигонов эти артефакты стремятся к нулю.
              0
              Для файлов в 5-7 гигапикселей и 20 гигабайт операции «открыть, применить кривые, повысить контраст, сохранить, закрыть» занимали по 2-3 часа.
              Для каждой операции?
                +1
                В сумме для «пакета» (написанного в кавычках). Почти всегда свап фотошопа не влазил полностью на ssd, а медленный ноутбучный жесткий диск для этого малопригоден.
                0
                Эх, как же город изменился за 6 лет… ох.
                  +2
                  Какой же он красивый! Я слышал много хорошего о Екатерингубрге (вроде «хочу поехать туда жить») и теперь я понимаю почему.
                    0
                    Неплохо. Прекрасно просматриваются номера машин на стоянках, особенно хорошо освещённые.
                    А есть такое в СПб? Если нет — кто сделает?
                      0
                      Я бы сделал. По крайней мере мне было бы это интересно.
                      Но откуда? Исакиевский не так уж и высок. Говорят, что еще какая-то телебашня есть…
                        +3
                        Вот. Высокое разрешение будет позже — очень сложно поймать хорошую погоду.
                          0
                          Круто! Погоду бы еще, да.
                            0
                            в этом году в Питере было 3(!) пригодных для съёмки дня. и все три дня доступа на верх не было.
                              0
                              А меня в Москве погода не радует. Я тут 2 месяца уже.
                              Хотел со шпиля МГУ поснимать (как дурак официальный запрос написал 22 июля, так они до сих пор думают!).
                              Но погоды подходящей тоже было… 3-4 дня. Не более.

                              А почему доступа не было? «Режимный объект»?
                                0
                                нет, ответственный был в отпуске :)
                                  0
                                  а почему не с останкинской телебашни?
                                    0
                                    А на что с Отанкино смотреть?
                                    По крайней мере меня не радует округа. Плюс там нужен телевик «подлиннее». А на фотопрокатах я скоро разорюсь просто :)

                                    МГУ (вид на парк и лужники) — меня у руферов пост в жж впечатлил. Захотелось.
                                    Сам гигапиксель ради гигапикселя мне мало интересен. Картнику бы еще.
                                      0
                                      понятно.
                                      в Питере с картинкой тоже сложно — нужна либо идеальная погода и 300+ чтоб снять центр, либо доступ на какие-то здания в центре. но во втором случае сфера не получится.
                                0
                                да, спасибо за отзыв :)
                            +1
                            Сам подниму тему о кросс-постах и перепечатках.

                            Изначально статья сюда и писалась. В более подробном варианте, хотя и более ЖЖ'ном, наверное.
                            Не пропустили.

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

                                Если точка съемки ушла не сильно далеко, то можно попробовать сшить автоматом. Пусть тем же фотошопом. Я делал подобное с фотографиями интерьеров, снятыми с несоблюдением нодальной точки.

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

                                Знаю, что коллеги иногда так делали, но на менее масштабных проектах.

                                Честно пробовал такой подход и тут, но нереальным посчитал.
                                0
                                  0
                                  Хм. Узнал это место, точно ретушировал. Ниужели файлы на сервере не обновил.
                                  Завтра исправлю. Вместе с тем, что и в соседней теме нашли.
                                    0
                                    Самый центр города, потому и бромились в глаза
                                  0
                                  Расскажите пожалуйста как Вы реализовали изменение адресной строки в браузере при смене обзора? (можно в личку)
                                    +1
                                    код
                                        <script src="jquery.min.js"></script>
                                    	
                                    	<script>
                                        var hashTimeout;
                                        
                                        function updhash() {
                                            if (hashTimeout) clearTimeout(hashTimeout);
                                            hashTimeout = setTimeout(function() {
                                                hashTimeout = null;
                                                var k = $('#krpanoSWFObject')[0];
                                                window.location.hash="#"+k.get('xml.url').substr(0, 2)+"="+k.get('view.hlookat')+"="+k.get('view.vlookat')+"="+k.get('view.fov');
                                            }, 100);    
                                        }
                                        
                                        $(document).ready(function(){
                                            var swf = createswf("krpano.swf");
                                            var options = window.location.hash.substr(1).split('=');
                                            if (options.length == 4) {
                                                swf.addVariable("xml",parseInt(options[0])+'.xml');
                                                swf.addVariable("view.hlookat", options[1]);
                                                swf.addVariable("view.vlookat", options[2]);
                                                swf.addVariable("view.fov", options[3]);
                                            }
                                            else {
                                                swf.addVariable("xml", "11.xml");
                                            }
                                            
                                            swf.embed("pano"); 
                                        });
                                        
                                    	</script>
                                    


                                    в index.html и все заведется.

                                    get('view.fov') — и т.п. парсится выхлоп движка krpano.



                                    Подсмотрел у Ситисканнера, за что им спасибо, допилил под себя.
                                    В текущей реализации xml'ки, содержащие данные о каждой панораме, должны иметь имена в виде двузначного числа.
                                    Дальнейшее допиливание этого кода не делал. Хотя планирую разобаться и сделать получше.
                                      0
                                      Спасибо
                                        0
                                        есть более изящное решение — у krpano есть событие 'onidle'. ну а дальше — вызвать любой понравившейся код для обновления адресной строки.
                                      +1
                                      Черт подери, да я номера машин легко могу прочить, да чего уж там, я, вероятно, смог бы разглядеть показания градусника на ближайшем доме с точностью до 5-10 градусов, будь он лицевой стороной наружу.
                                      про градусник
                                      27 пикселя на видимую часть градусника, с расчетом шкалы от -50 до 50, с небольшой погрешностью на искажения и освещение.

                                        0
                                        0
                                        > нетбук следующей конфигурации: i7-2670QM / 16Gb RAM / 128Gb SSD / 640Gb HDD.
                                        Нифига себе нетбук! Можно модель?
                                          0
                                          Acer 7750G.
                                          Наиболее доступный (на помент покупки) из поддерживающих много памяти и 2 отсека под накопители (ssd был в комплекте).
                                            0
                                            Ну дык это же 17-ти дюймовый комбайн, а не "нетбук" :)
                                              0
                                              Но тормозит -то как нетбук!
                                          0
                                          Интересные расчеты.
                                            0
                                            Вот тут кто-то себе тепличку прям на крыше запилил, чтоб на дачу не кататься
                                            ekburg.artstudio-3d.ru/#11=-24.597416693005464=6.152565332921826=1.0813042631097032

                                            А вот тут вроде какое-то тело на кресле, не пойму, но забавно
                                            ekburg.artstudio-3d.ru/#11=-12.564052499837278=6.628463085880977=1.0813042631097032

                                            А вот парень, уходящий в асфальт
                                            ekburg.artstudio-3d.ru/#11=-64.84846206874312=28.20498131201244=1.1660131738590613

                                            А вообще крутотень.
                                              0
                                              Класс! Всегда мечтал сделать нечно подобное, но пока дальше пары десятков кадров не заходил ;)

                                              Вопрос:
                                              Режим – Av. М, при съемке такого числа кадров, не имеет смысла. Разбег освещенностей ни в одну матрицу по ДД не влезет.


                                              Поясните этот момент, плиз… Т.е. использовался режим приоритета диафрагмы? И почему такое внимание уделено перепадам яркости (разбегу освещенности)? Разве софт, в данном случае PTGui, не корректирует эту проблему автоматически?

                                                0
                                                Режим Ав — по простой причине. В М — не влезет.
                                                Вне зависимости от мнения гуру-теоретиков с фото.ру. (Мне пытались доказать, что Ав для криворучек, фотографам – только М.)
                                                Рассмотрим 2 крайних примера. Состоит наша панорама из, скажем, тысячи кадров.
                                                Пусть один из них — это черная машина, стоящая в тени у веского дома. А другой — кусок светлой стены здания, освещенный прямым солнцем. Кстати оба варианта — абсолютно реальны, из практики.
                                                Как выставлять экспозицию? По которому? Диапазон огромен. Поэтому Ав.

                                                В PTGui, есть инструментарий для работы с (псевдо?)HDR, т.е. он умеет съедать по 3 экземпляра (разных по экспозиции) каждого кадра… Но работает это крайне… убого. По крайней мере, по сравнению с вариантом «сразу скормить нормальное сырье». Да и процессорного времени ест намного больше. Нет смысла.
                                                Так что я сначала отобрал сырье. Потом предварительно его сконвертировал.
                                                Сшил предварительную панораму, и в режиме «превью» ptgui смотрел какие исходные кадры надо проявить иначе (посветлее сделать, потемнее). И, таким образом, подменял кадры.
                                                А потом, при финальной сшивке ptgui стандартным методом все это сблендил.
                                                Может быть, сумбурно, но суть, думаю, ясна?
                                                  0
                                                  Да, теперь я понял — действительно, есть принципиальная разница между дессятком кадров и тысячей. На тысяче кадров экспозиция будет выставлена по каждому объекту, например теневая сторона дома и его же светлая сторона. Приоритет диафрагмы в этом случае сделает примерно одинаковые по свету картинки.

                                                  Еще вопрос — снималось все в RAW?
                                                    0
                                                    Да, конечно. Когда «на работе» — снимаю только в рав. Да и… не место же экономить.
                                                0
                                                Очень хочу снять гигапиксельную панораму своего родного Нижнего Новгорода, одолжите «панорамомашину».
                                                Есть опыт снятия панорам с рук по 180 кадров (пока что рекорд).
                                                  0
                                                  Сейчас ее нет на руках. Слишком дорогая игрушка. Следующим летом опять возьму.
                                                  0
                                                  Спасибо за информацию о призраках избежавших ретуши в прошлый раз.
                                                  Отретушировал.
                                                  Перезалил файлы.

                                                  офтопик:
                                                  доделал виртуальный тур по РУДН:
                                                  vt-rudn.artstudio-3d.ru/
                                                  Гигапикселей там нет, но территория тоже интересна.

                                                  Only users with full accounts can post comments. Log in, please.