Автоматизация съемки сферических панорам с помощью фотокубиков

фото

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

Следующей ступенью автоматизации является штативная головка, позволяющая поворачивать камеру относительно центра перспективы объектива на фиксированный угол. Если панорама снимается объективом Круговой рыбий глаз, то при использовании подобной штативной головки дополнительной автоматизации не требуется. При съемке достаточно сделать 3 или 4 кадра, и точность установки угла поворота может варьироваться в широком пределе, поскольку кадры существенно перекрываются. Если камера имеет матрицу 24×36 мм, то проблем с поиском для нее объектива Круговой рыбий глаз нет. Однако большинство камер со сменной оптикой имеют матрицу вдвое меньшего размера. Найти для них объектив Круговой рыбий глаз может оказаться проблемой. Если же воспользоваться объективом Диагональный рыбий глаз, то кадров надо делать существенно больше, и автоматизация процесса становится весьма актуальной.

В данной статье я рассматриваю один из возможных вариантов сборки установки для съемки сферических панорам камерой Canon EOS 1000D с объективом Пеленг. Для данной камеры объектив Пеленг является практически диагональным объективом Рыбий глаз, т. е. угол зрения по диагонали кадра чуть больше 180 градусов. Таким образом, чтобы получить качественную сферическую панораму при портретной ориентации кадра, надо снять два ряда по пять кадров.

Механика

Центр перспективы объектива Пеленг лежит фактически в плоскости передней линзы. Относительно него камеру надо вращать в двух плоскостях: вертикальной и горизонтальной. В горизонтальной плоскости надо обеспечить возможность поворота камеры на 360 градусов, а в вертикальной — на 180, хотя обычно хватает и 90 градусов. С вращением в горизонтальной плоскости особых проблем нет: надо только сдвинуть камеру и сделать моторный привод. Если ось вращения строго вертикальна, т. е. штатив выставлен по уровню, то усилие, необходимое для поворота, минимально, и нет необходимости фиксации точки остановки. То есть штанга с камерой может быть установлена прямо на ось двигателя.

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

фото

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

фото
Установлена камера Canon EOS 5D с объективом Пеленг

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

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

фото
фото

Способов крепления камеры к подобной конструкции, если нам нужна съемка однорядных панорам, может быть предложено бесконечное количество. Ниже приведены некоторые из них.

фото фото
Камера Canon EOS 5D с круговым объективом Рыбий глаз Пеленг позволяет получить сферическую панораму, не вращая камеру в вертикальной плоскости

Если использовать объектив диагональный Рыбий глаз, то для увеличения вертикального угла обзора может быть актуальным установка камеры под углом.

фото

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

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

Электроника

Управлять шаговыми двигателями можно самыми разными способами. Первоначально с вышеописанной механической конструкцией я использовал систему на базе микроконтроллера PIC18F2550, шаговые двигатели были подключены с помощью микросхем A2917, извлеченных из принтера Epson Stylus Photo EX, и все это управлялось от нетбука, подвешенного под камеру и вращавшегося вместе со всей установкой. Получившаяся система была, конечно, очень гибкой по возможности изменять скорость и шаг вращения, однако когда оптимальные значения были найдены, эта гибкость стала излишней. Если на съемку берется определенная камера с определенным объективом, то нужен реально всего один режим, в крайнем случае два. Варьировать все параметры на выезде вряд ли целесообразно. Поэтому в данной статье описывается система на основе блока Freeduino Nano v5 и моторного модуля Freeduino Motor Shield v3.

фото

Программирование в среде Arduino.exe и установка пакета под ОС Windows описаны во второй части статьи про создание фоторобота для съемки панорам. Установка под ОС Linux, если для вашего дистрибутива есть соответствующей пакет, еще проще, поскольку не надо отдельно устанавливать драйвер. Если же вы собираете программу из исходных кодов, то внимательно читайте описание для каждой из необходимых программ, поскольку установка зависит от дистрибутива и может отличается от привычной. Не следует также забывать, что к исходному коду, даже последнему релизу, могут быть необходимы заплатки (patch).

Питание установки осуществляется от 8 включенных последовательно элементов АА. От 5 питается микроконтроллер, и от всех 8 — шаговые двигатели.

Для управления затвором используется простейший кубик на одном оптроне. Светодиод в схеме используется исключительно для удобства отладки, чтобы не расходовать зря ресурс затвора камеры.

фото
схема

Ниже приведен текст управляющей программы.

// Adafruit Motor shield library
// copyright Adafruit Industries LLC, 2009
// this code is public domain, enjoy!
// Съемка сферической панорамы

#include

AF_Stepper motor1(48, 1); // Число шагов на один оборот мотора для 1-го двигателя
AF_Stepper motor2(48, 2);
int ledPin = 10; // Ножка кнопки спуска затвора
int buttonPin = 9; // Ножка перемычки. Если замкнута, то два ряда, иначе один
int buttonState = 0; // Состояние перемычки
int wzat = 3000; // Время нажатия кнопки затвора — 3 с
int wp = 6000; // Пауза перед спуском затвора — 6 с

void setup() {
    buttonState = digitalRead(buttonPin);// Чтение состояния перемычки
    pinMode(buttonPin, INPUT); // Включаем ножку на прием сигналов
    pinMode(ledPin, OUTPUT); // Включаем ножку на вывод сигналов
    motor1.setSpeed(40); // Скорость вращения — 40 оборотов в минуту
    motor1.release(); // Отключаем питание двигателя
    motor2.setSpeed(120);
    motor2.release();
    for (int i=0; i <= 4; i++) {
        delay(wp);
        digitalWrite(ledPin, HIGH); // Нажимаем спусковую кнопку
        delay(wzat); // Ждем
        digitalWrite(ledPin, LOW); // Отпускаем спусковую кнопку
        motor1.step(280, FORWARD, DOUBLE);
        motor1.release();
        }
    if (buttonState == HIGH) {
        motor1.step(140, FORWARD, DOUBLE); // Поворачиваем на полшага по горизонтали
        motor1.release();
        motor2.step(1000, BACKWARD, DOUBLE);// Поворачиваем камеру вверх
        motor2.release();
        for (int i=0; i <= 3; i++) {
            delay(wp);
            digitalWrite(ledPin, HIGH);
            delay(wzat);
            digitalWrite(ledPin, LOW);
            motor1.step(280, FORWARD, DOUBLE);
            motor1.release();
            }
        delay(wp);
        digitalWrite(ledPin, HIGH);
        delay(wzat);
        digitalWrite(ledPin, LOW);
        motor1.step(140, FORWARD, DOUBLE); // Возвращаем в исходное состояние по горизонтали
        motor1.release();
        motor2.step(1000, FORWARD, DOUBLE); // Поворачиваем вниз в исходное состояние
        motor2.release();
        }
    }

void loop() {
    }

При нажатии кнопки reset программа стартует, выдерживает паузу, чтобы успокоились колебания камеры на штативе, далее замыкает контакты дистанционного пульта на 3 секунды. В этом случае, если камера установлена в режим серийной съемки с эксповилкой, она успеет сделать 3 снимка. После этого камера поворачивается на 72 градуса, и этот цикл повторяется еще 4 раза. После этого камера поворачивается на 36 градусов в горизонтальной плоскости и на 60 градусов вверх и начинает съемку следующего ряда панорамы. Поскольку неподвижных элементов в конструкции нет, все движется как единое целое, поэтому можно позволить себе вращение только в одну сторону, и для возврата в начальную точку достаточно еще повернуться по горизонтали на 36 градусов и по вертикали вниз на 60.

Обычно я устанавливаю камеру в ручной режим, выбираю выдержку таким образом, чтобы для сюжетно важной части была нормальной экспозиция, устанавливаю фиксированный режим белого, поворачиваю камеру вниз таким образом, чтобы в кадр попала вертикальная ось установки, и после этого включением питания или нажатием кнопки reset можно запустить процесс съемки. Если по каким-то причинам окажется, что надо переснять только один ряд панорам, то мы размыкаем перемычку (опрашивая состояние которой, программа решает, надо ли приступать ко второму ряду), устанавливаем вручную нужный нам угол в вертикальной плоскости и запускаем процесс съемки.

Обработка результатов

Таким образом, панорама, снятая вышеописанной установкой, состоит как минимум из десяти кадров. А если снималась с эксповилкой — то из 30. Расставлять контрольные точки между всеми этими кадрами вручную — занятие не очень трудоемкое, но длительное. Поэтому неплохо бы этот процесс автоматизировать. И здесь хорошая новость: в конце мая вышла новая версия программы сшивки панорам hugin. Основные изменения в новой версии как раз касаются сшивки сферических панорам. Во-первых, автоматизированная система расстановки контрольных точек теперь работает существенно увереннее с кадрами, снятыми объективом Рыбий глаз, а во-вторых, появилась возможность предварительного просмотра сферических панорам не только в эквидистантной проекции, но и натянутых на глобус.

hugin

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

панорама

С помощью SaladoPlayer 1.0 ее можно посмотреть здесь. Подробно о SaladoPlayer читайте в статье «Обзор нескольких способов представления сферических панорам».




22 июля 2011 Г.

— , . . — , . — , , , , . , . , .

, . , . 3 4 , , . 24×36 , . . . , , .

Canon EOS 1000D . , . . 180 . , , .

. : . 360 , — 180, 90 . : . , . . , , , , . .

, , , , - . , , , . , . , .

, , . , , .


Canon EOS 5D

, , . , . .

— , , . , , — .


, , . .


Canon EOS 5D ,

, .

, , . . , . , , - . . — (, ), - .

, — . , , , , , . . . , .

. PIC18F2550, A2917, Epson Stylus Photo EX, , . , , , , . , , . . Freeduino Nano v5 Freeduino Motor Shield v3.

Arduino.exe Windows . Linux, , , . , , . , , , (patch).

8 . 5 , 8 — .

. , .


.

// Adafruit Motor shield library
// copyright Adafruit Industries LLC, 2009
// this code is public domain, enjoy!
//

#include <AFMotor.h>

AF_Stepper motor1(48, 1); // 1-
AF_Stepper motor2(48, 2);
int ledPin = 10; //
int buttonPin = 9; // . , ,
int buttonState = 0; //
int wzat = 3000; // — 3
int wp = 6000; // — 6

void setup() {
    buttonState = digitalRead(buttonPin);//
    pinMode(buttonPin, INPUT); //
    pinMode(ledPin, OUTPUT); //
    motor1.setSpeed(40); // — 40
    motor1.release(); //
    motor2.setSpeed(120);
    motor2.release();
    for (int i=0; i <= 4; i++) {
        delay(wp);
        digitalWrite(ledPin, HIGH); //
        delay(wzat); //
        digitalWrite(ledPin, LOW); //
        motor1.step(280, FORWARD, DOUBLE);
        motor1.release();
        }
    if (buttonState == HIGH) {
        motor1.step(140, FORWARD, DOUBLE); //
        motor1.release();
        motor2.step(1000, BACKWARD, DOUBLE);//
        motor2.release();
        for (int i=0; i <= 3; i++) {
            delay(wp);
            digitalWrite(ledPin, HIGH);
            delay(wzat);
            digitalWrite(ledPin, LOW);
            motor1.step(280, FORWARD, DOUBLE);
            motor1.release();
            }
        delay(wp);
        digitalWrite(ledPin, HIGH);
        delay(wzat);
        digitalWrite(ledPin, LOW);
        motor1.step(140, FORWARD, DOUBLE); //
        motor1.release();
        motor2.step(1000, FORWARD, DOUBLE); //
        motor2.release();
        }
    }

void loop() {
    }

reset , , , 3 . , , 3 . 72 , 4 . 36 60 . , , , 36 60.

, , , , , , reset . - , , ( , , ), .

, , , . — 30. — , . . : hugin. . -, , , -, , .

hugin

hugin, , , , . , , , . , , hugin , , , , . .

SaladoPlayer 1.0 . SaladoPlayer « ».