Автоматизация съемки сферических панорам с помощью камеры Sony NEX-5

фото

Автоматизации съемки панорам мы уже посвятили целый ряд статей:

Казалось бы, вопрос исчерпан, однако ж нет. Фотокубики позволяют решить одну и ту же задачу самыми разными способами. Но главное, что камер существует сегодня уже бесконечное количество. И для каждой требуется свое специфическое решение, поскольку о стандартном способе управления производители даже не пытались договориться. Особенностью камеры Sony NEX-5 (Часть 2) является то, что камерой можно управлять только по ИК-каналу, причем последовательность импульсов, которые надо передать, довольно длинная.

АЦП с частотой преобразования 120 кГц устройства L-Card E-154 с помощью программы LGraph2 превращает компьютер в подобие осциллографа, что позволяет оцифровать и записать сигнал с пульта дистанционного управления Sony RMT-DSLR1.

фото

Обращаю внимание, что, в отличие от большинства других камер, информацию несет длина импульсов, а не пауз между ними. Пауза имеет постоянную длину в 576 мкс. В результате, получаем следующую последовательность импульсов в микросекундах с несущей частотой 38 кГц:
2432; 1216; 640; 1216; 1216; 640; 1216; 640; 640; 1216; 640; 1216; 1216; 1216; 640; 640; 640; 1216; 1216; 1216; 1216.

Для успешного спуска затвора эта последовательность должна повторяться не менее 3 раз с интервалом 11136 мкс.

Способ, описанный в статье «ИК-пульт управления для камер Canon на базе микрокомпьютера Freeduino Through-Hole» и требующий экспериментальной подборки параметров, является не очень удобным. В данной статье для генерации несущей частоты предлагается использовать режим широтно-импульсной модуляции (ШИМ) микроконтроллера Freeduino Nano v5.

Вторая особенность камер Sony NEX — это то, что для них существует насадка Sony VCL-ECF1, превращающая 16 мм объектив в объектив Рыбий глаз. В данной статье будет рассмотрено получение сферических панорам как с помощью 16 мм объектива, так и с помощью 16 мм объектива с насадкой. Кроме того, будет представлено и уже апробированное решение с использованием объектива Пеленг.

Конструкция полностью идентична использующейся с камерами Canon и описанной в статье. Отличий всего два. Это крепление источника ИК-сигнала, сделанного на светодиоде АЛ107 с включенным последовательно сопротивлением в 1 кОм, которое подключается напрямую к выходу микроконтроллера.

фото
фото

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

фото
фото

Для надежной фиксации была сделана площадка из винипласта, в которой было выдолблено углубление, по форме соответствующее опорной поверхности камеры. Для того чтобы площадка не проворачивалась, в нее ввинчен дополнительный шип. Этот шип вместе со штативным болтом не позволяет площадке провернуться относительно рейки. В то же время фиксация осуществляется одной контргайкой, что позволяет легко выставить камеру с любым объективом в такое положение, при котором вращение осуществляется относительно центра перспективы. Поскольку форма днища у камеры Sony NEX весьма хитрая, то выдолбить в площадке углубление, точно ему соответствующее, дело достаточно сложное. Я для этого применил отнюдь не самый безопасный для камеры способ. Я разогревал винипластовую пластину, после чего прижимал к ней с помощью штативного винта камеру. На размягченной пластине оставался отпечаток, который в дальнейшем углублялся стамеской, после чего процесс повторялся.

На приведенных фотографиях можно увидеть три варианта установки: с объективом 16 мм и с объективом Пеленг. Фотография установки с объективом 16 мм и насадкой Sony VCL-ECF1 размещена в начале статьи.

фото
фото

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

Программу управления съемкой для последующего использования можно скачать здесь.

Поскольку программа получилась достаточно короткая и я постарался достаточно хорошо ее прокомментировать, то приведу полностью ее текст в статье:

// Adafruit Motor shield library
// copyright Adafruit Industries LLC, 2009
// this code is public domain, enjoy!
// Съемка сферической панорамы камерой NEX-5
// www.rwpbb.ru, 2011 #include
int pulscount=1; // Счетчик числа импульсов в пакете ИК
int puls = 4; // Число пакетов ИК
AF_Stepper motor1(48, 1); // Число шагов на один оборот мотора для 1-го двигателя
AF_Stepper motor2(200, 2);
int buttonPin = 9; // Ножка перемычки. Если 5 В, то съемка с насадкой в два ряда
int buttonState = 0; // Состояние перемычки
int wzat = 3000; // Время нажатия кнопки затвора — 3 с
int wp = 4000; // Пауза перед спуском затвора — 4 с
int mstepx = 280; // Число шагов двигателя при повороте на единичный угол по горизонтали (360—1400)
int nmstepx = 4; // 5 снимков в ряду по горизонтали для съемки с насадкой
int mstepy = 1700; // Число шагов двигателя при повороте на единичный угол по вертикали (180—5000)
int nmstepy = 1;

void setup()
{
TCCR1A = _BV(COM1A1) | _BV(COM1B1) ; // phase and frequency correct mode. NON-inverted mode
TCCR1B = _BV(WGM13) | _BV(CS10); // Делитель N = 1 — (_BV(CS10)); 8 — (_BV(CS11))
OCR1B = 0; // Скважность 102 — рабочий сигнал, 0 — сигнал отсутствует
ICR1 = 210; // Частота 16 МГц/2·N·ICR1 = 16000 кГц/(2·1·210) = 38095 Гц
pinMode(10, OUTPUT); // К 10-й ножке подключен ИК-светодиод АЛ107 через сопротивление 1 кОм
pinMode(buttonPin, INPUT); // Включаем ножку на прием сигналов
digitalWrite(buttonPin, LOW); //Включаем подтягивающие резисторы на землю
buttonState = digitalRead(buttonPin); // Чтение состояния перемычки
motor1.setSpeed(40); // Скорость вращения 40 оборотов в минуту
motor1.release(); // Отключаем питание двигателя
motor2.setSpeed(15);
motor2.release();
if (buttonState == LOW)
{
mstepx = 140;
nmstepx = 9;
mstepy = 1500;
nmstepy = 2;
}
motor2.step((mstepy*nmstepy/2), FORWARD, DOUBLE); // Поворачиваем вниз
motor2.release();
for (int i=0; i <= nmstepx; i++)
{
IR_Sony(); // Нажимаем спусковую кнопку
motor1.step(mstepx, FORWARD, DOUBLE);
motor1.release();
}
motor1.step((mstepx/2), FORWARD, DOUBLE); // Поворачиваем на пол-угла по горизонтали
motor1.release();
motor2.step(mstepy, BACKWARD, DOUBLE);// Поворачиваем камеру вверх
motor2.release();
for (int i=0; i <= (nmstepx-1); i++)
{
IR_Sony(); // Нажимаем спусковую кнопку
motor1.step(mstepx, FORWARD, DOUBLE);
motor1.release();
}
IR_Sony(); // Нажимаем спусковую кнопку
motor1.step((mstepx/2), FORWARD, DOUBLE); // Поворачиваем на пол-угла по горизонтали
motor1.release();
if (buttonState == LOW)
{
motor2.step(mstepy, BACKWARD, DOUBLE);// Поворачиваем камеру вверх
motor2.release();
for (int i=0; i <= (nmstepx); i++)
{
IR_Sony(); // Нажимаем спусковую кнопку
motor1.step(mstepx, FORWARD, DOUBLE);
motor1.release();
}
}
motor2.step((mstepy*nmstepy/2), FORWARD, DOUBLE); // Поворачиваем вниз в исходное состояние
motor2.release();
}

void loop()
{
}

void IR_Sony() // Подпрограмма подачи ИК-сигнала для спуска затвора камеры NEX5
{
digitalWrite(13, HIGH); // Индикация паузы светодиодом на плате
delay(wp); // Пауза перед спуском затвора
digitalWrite(13, LOW);
pulscount=1;
while (pulscount {
OCR1B = 102; // включаем светодиод
delayMicroseconds(2432); // светодиод горит микросекунд
OCR1B = 0; // выключаем светодиод
delayMicroseconds(576); // светодиод выключен микросекунд
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(640);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(640);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(640);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(640);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(640);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(640);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(640);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(640);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(11136);
pulscount++;
}
digitalWrite(13, HIGH);
delay(wzat); // Время нажатия кнопки затвора
digitalWrite(13, LOW);
}

Изначально камера устанавливается в горизонтальное положение и наводится на центральную часть панорамы. Желательно выбрать тот участок, который можно считать эталонным по освещенности. Прежде, чем приступать к съемке панорамы, есть смысл сделать несколько кадров и убедиться, что выдержка и диафрагма выбраны правильно. Камеры следует переключить в режим ручного управления и установить фиксированный баланс белого. Я предлагаю не экономить и снимать в режиме RAW + JPEG. RAW часто бывает предпочтительнее, поскольку динамический диапазон всей сферической панорамы может быть весьма значительным, а снимать с вилкой этой камерой не получится, поскольку выбор режимов у нее устроен таким образом, что либо эксповилка, либо дистанционное управление. Поэтому, если динамического диапазона все-таки не хватает, то надо последовательно снимать несколько сферических панорам с разной экспозицией. Кроме того, RAW удобен и для более качественного исправления хроматических аберраций. Это особенно актуально, если используется 16 мм объектив с насадкой. Автофокусировку в большинстве случаев тоже стоит отключить, и навести камеру вручную на гиперфокальное расстояние.

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

hugin
Визуализация связей между кадрами в программе hugin при съемке сферической панорамы 16 мм объективом с насадкой Sony VCL-ECF1

В случае использования 16 мм широкоугольного объектива потребуется уже 3 ряда по 10 кадров.

hugin

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

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

Процесс съемки мы автоматизировали и сделали достаточно быстрым и комфортным. Панорам за день можно наснимать так много, что можно даже попытаться конкурировать c Google Street View. Но вот обработка остается все равно если не трудоемким, то длительным процессом. Рассмотрим основные стадии и программы использования в процессе обработки.

1. Преобразование RAW в TIFF и исправление хроматических аберраций. Я для этого предлагаю использовать программы либо RawTherapee, либо DarkTable. Летом вышла, наконец, стабильная третья версия программы RawTherapee, версия DarkTable на данный момент 0.9.2, т. е. это еще не стабильная версия, но вполне работоспособная. Автоматическая коррекция хроматических аберраций в обеих программах с насадкой не справилась, поэтому приходится подбирать значения вручную. Сдвиг там имеет довольно хитрую зависимость, поэтому надо стремиться устранить хроматические аберрации не на самом краю кадра, а чуть отступив от него, поскольку самые края все равно будут отброшены при сшивке.

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

Открываем вторую закладку программы и загружаем снимки. Поскольку камера не записывает данные о насадке в EXIF, то надо перейти на третью закладку «Камера и объектив» и вручную задать параметры объектива или загрузить этот файл.

hugin

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

В случае использования объектива Пеленг переходим на четвертую закладку «Кадрирование» и обрезаем углы. Если необходимо убрать что-то случайно попавшее на один из кадров, то можно воспользоваться пятой закладкой «Маска». Альтернативное решение: на последней закладке «Сборка панорамы» ставим галочку в пункте «перепроецированные снимки» и затем в графическом редакторе загружаем в новый слой правильный снимок, и с помощью маски сводим его фрагмент с остальной панорамой.

Возвращаемся на вторую закладку «Снимки» и запускаем модуль автоматической расстановки контрольных точек — CPFind. Обращаю внимание, что в выпадающем меню можно выбрать несколько режимов работы этой подпрограммы.

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

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

Открываем закладку «Экспозиция» и запускаем выравнивание кадров по экспозиции и балансу белого. Если панорама снята с постоянной экспозицией для всех кадров, то эта операция необходима в основном для устранения виньетирования.

Нажимем кнопку «Просмотр панорамы с аппаратным ускорением» и на вкладке «Проекция» выбираем — «Эквидистантная». При необходимости на вкладке «Перемещение на плоскости проекции» выравниваем горизонт.

Возвращаемся в окно основной программы и открываем последнюю закладку «Сборка панорамы». Проверяем, что в графе поле обзора стоят цифры 360 и 180 градусов. Нажимаем кнопку «Рассчитать оптимальный размер». Если съемка велась без экспозиционной вилки, то ставим галочку в первом пункте «Коррекция экспозиции, узкий динамический диапазон». Нажимаем кнопку «Собрать сейчас» и ждем минут десять результата.

3. Корректировка экспозиции полученной панорамы и при желании тональное отображение. Поскольку если входящие файлы у нас были 16-битные TIFF, то и на выходе у нас будет 16-битный файл. Так что выбор программ, которые с ним могут работать, не так уж велик. Можно использовать какой-нибудь из полнофункциональных графических редакторов типа CinePaint или Krita. Свободных программ с подобной функциональностью для Windows я, откровенно говоря, не знаю. Так что, скорее всего, придется заплатить за какой-то из коммерческих продуктов. В Linux можно воспользоваться и более простыми средствами типа программы Fotoxx. С коррекцией и тоновоспроизведением он справляется прекрасно. К сожалению, размеры получаемых файлов оказываются столь большими, что в окне изменения размера не хватает значащих цифр. Другими словами, файл можно откорректировать и сохранить без изменения размера. Конечно, есть вариант задать размер в процентах, но это не всегда удобно, а вот в пикселях уже не получится. Если нужен более изощренный алгоритм тонального отображения, то можно воспользоваться программой Luminance HDR.

4. Ретушь надира и зенита. Для этого нам нужно полученную панораму из эквидистантной проекции преобразовать в кубическую. Это можно сделать либо программой SaladoConverter, либо пакетом программ Panotools-Script.

Запускаем скрипт «erect2cubic»:

erect2cubic --erect=panorama.tif --ptofile=cube_project.pto

Получаем на выходе файл cube_project.pto. Это файл настроек hugin для преобразования из эквидистантной в кубическую проекцию с помощью программы «nona». Запускаем ее:

nona -o cube_prefix cube_project.pto

Panotools-Script при необходимости позволяет после ретуши верхнего и нижнего квадратов преобразовать снова в эквидистантную проекцию. Это можно сделать с помощью программы «cubic2erect»:

cubic2erect front.tif right.tif back.tif left.tif up.tif down.tif equirectangular.tif
[cubic2erect cube_prefix0000.tif cube_prefix0001.tif cube_prefix0002.tif cube_prefix0003.tif cube_prefix0004.tif cube_prefix0005.tif equirectangular.tif]

Подробнее см. в статье «Сферические панорамы».

5. Для демонстрации сферической панорамы на локальной машине можно воспользоваться программой Panini. Программа уже пару лет не обновляется, но пока достойно отвечает на все вызовы времени. Для презентации же в интернете я предлагаю использовать программу SaladoPlayer. Недавно вышла версия 1.2. Похоже, все мелкие проблемы, связанные с привязкой панорам к картам, бывшие в версии 1.0, устранены. Появилась возможность выводить паралельно на экран карту Google и привязывать к ней панораму. Подробнее о разных способах представления сферических панорам я писал в статье «Обзор нескольких способов представления сферических панорам». Отмечу, что в случае съемки 16 мм объективом панорама получается размером 19452×9726 пикселей в эквидистантной проекции, что по детализации эквивалентно снимку 180 Мп камерой. Это означает, что для просмотра столь больших файлов без использования технологии типа Deep Zoom уже не обойтись. При просмотре панорам на сенсорных планшетах под управлением ОС Android перемещать панораму пальцем удается обычно только включив полноэкранный режим. При этом, правда, масштабирование двумя пальцами не работает. В обычном режиме большинство обозревателей интернета дуреют, не понимая, что от них хотят.

Здесь можно посмотреть панораму, снятую объективом с фокусным расстоянием 16 мм, а здесь панораму с той же точки, снятую с использованием этого объектива и насадки Sony VCL-ECF1. В последнем случае реализована и возможность привязки к карте Google.

P. S.

Итак, инструмент создан, осталось научиться им эффективно пользоваться. Для статичных объектов установка позволяет получить детализацию снимка лучшую, чем теоретически возможно достигнуть с помощью единственного снимка с самым лучшим объективом и матрицей. Фактически мы не зависим от аппарата. Какой бы матрицей не обладал аппарат, мы всегда можем подобрать объектив и запрограммировать установку таким образом, чтобы получить сколь угодно детализированную фотографию. Это, конечно, не значит, что нам все равно, какой аппарат использовать. Время съемки, возможность снимать при недостатке освещения и, разумеется, удобство, безусловно, от него зависят. Однако маленькая матрица не всегда зло в нашем случае, и почти совпадающий по габаритам с Sony NEX-5 Nikon J1 может лучше подойти данной установке в силу большей глубины резкости и заявленных возможностей полноценного дистанционного управления.

фото

Однако вернемся к нашим баранам. Фотограф, вышедший на съемку с вышеописанной установкой, всегда имеет выбор между съемкой панорамы с насадкой и без. Насадка легкая и, следовательно, карман не тянет. Переход из одного режима в другой занимает от силы минуту. Однако критерием выбора является не только желаемый размер панорамы. Предположим, для демонстрации в интернете нам нужна панорама размером в эквидистантной проекции 10000×5000 пикселей. Подобная панорама может быть теоретически получена как с использованием объектива рыбий глаз, так и с широкоугольным объективом. Оценим плюсы и минусы.

Плюсы объектива рыбий глаз:

  1. Нужно меньшее число снимков, и панорама может быть снята в 2 раза быстрее. Нам нужно в 3 раза меньше снимков и всего два, а не три оборота камеры в горизонтальной плоскости.
  2. Сферическую панораму можно снять, даже если значительная часть пространства не имеет ярко выраженных деталей для точной расстановки контрольных точек.

Минусы объектива рыбий глаз:

  1. Размер 10000×5000 — практически предельный для этого объектива, и съемка в сыром формате с последующим исправлением хроматических аберраций является обязательной. Это, естественно, приводит к усложнению и удлинению процесса обработки.
  2. Автоматическая расстановка контрольных точек менее эффективна, чем для широкоугольного объектива, и в идеальном случае, когда все пространство сферы заполнено объектами, несмотря на меньшее число кадров этот процесс может занять больше времени.
  3. Повышенная вероятность поймать блик, который не может быть устранен выбором участка с соседнего кадра. Велика вероятность, что кадр будут портить не только источники света попавшие в кадр, но и их многократные отражения от линз объектива в абсолютно непредсказуемых точках кадра.

Плюсы широкоугольного объектива:

  1. Можно снимать в JPEG и не тратить времени на устранение хроматических аберраций. При таком разрешении они пренебрежимо малы.
  2. Процесс автоматической сшивки более эффективен. Необязательно создавать собственное описание объектива, можно положиться на реакцию автоматики, на данные о нем, взятые из заголовка EXIF.
  3. Можно использовать бленду и фильтры.

Минусы широкоугольного объектива:

  1. Не всегда можно снять полную сферическую панораму в силу отсутствия возможности точно расставить контрольные точки. Произвол можно попытаться скомпенсировать последующей длительной ретушью.
  2. Процесс съемки протекает медленнее.
  3. Если автоматика не справилась, то ручная расстановка контрольных точек займет больше времени, поскольку кадров в 3 раза больше.
  4. Меньшая глубина резкости может потребовать повторов с другой точкой фокусировки, что в результате увеличит как время съемки, так и обработки.

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

Если нужно получить панораму максимального качества невзирая на временные затраты, то эффективным приемом может стать не только съемка с экспозиционной вилкой и вилкой по точке фокусировки, но съемка панорамы двумя объективами. Например, при съемке гигапиксельной панорамы города может оказаться актуальным совместить здания на горизонте, снятые одним объективом, с небесной полусферой, снятой другим. При совмещении сферических панорам, снятых разными объективами, надо иметь в виду, что для совмещения разных участков можно преобразовывать панорамы в разные проекции. Надир и зенит удобно совмещать в кубической проекции, а объекты на горизонте — в эквидистантной или цилиндрической. Проблемой, впрочем, может стать то, что компьютер будет надолго задумываться или вообще откажется работать, сославшись на отсутствие памяти или мощности процессора. Кубическая проекция позволяет в 6 раз уменьшить размер, но надо помнить, что при ретуши лучше не приближаться к граням, а общая коррекция должна проводиться со всеми 6 гранями с абсолютно идентичными параметрами. Да и не любая программа способна переварить такие гигантские фотографии. Geeqie c 32-битной операционной системой показывать 180 Мп панораму отказался, а на той же машине, но с 64-битной операционной системой — согласился :-) Поэтому напомню, что для работы с большими фотографиями есть и специальные программы, например, nip2.




21 октября 2011 Г.

Sony NEX-5

Sony NEX-5

:

, , . . , . , . Sony NEX-5 ( 2) , -, , , .

120 L-Card E-154 LGraph2 , Sony RMT-DSLR1.

, , , , . 576 . , 38 :
2432; 1216; 640; 1216; 1216; 640; 1216; 640; 640; 1216; 640; 1216; 1216; 1216; 640; 640; 640; 1216; 1216; 1216; 1216.

3 11136 .

, «- Canon Freeduino Through-Hole» , . - () Freeduino Nano v5.

Sony NEX — , Sony VCL-ECF1, 16  . 16  , 16  . , .

Canon . . -, 107 1 , .


— , , . , 16 , ( ) .

, , . , . . , , . Sony NEX , , , . . , . , , .

: 16 . 16 Sony VCL-ECF1 .


, . , . .

.

, :

// Adafruit Motor shield library
// copyright Adafruit Industries LLC, 2009
// this code is public domain, enjoy!
// NEX-5
// www.rwpbb.ru, 2011
#include <AFMotor.h>
int pulscount=1; //
int puls = 4; //
AF_Stepper motor1(48, 1); // 1-
AF_Stepper motor2(200, 2);
int buttonPin = 9; // . 5 ,
int buttonState = 0; //
int wzat = 3000; // — 3
int wp = 4000; // — 4
int mstepx = 280; // (360—1400)
int nmstepx = 4; // 5
int mstepy = 1700; // (180—5000)
int nmstepy = 1;

void setup()
{
TCCR1A = _BV(COM1A1) | _BV(COM1B1) ; // phase and frequency correct mode. NON-inverted mode
TCCR1B = _BV(WGM13) | _BV(CS10); // N = 1 — (_BV(CS10)); 8 — (_BV(CS11))
OCR1B = 0; // 102 — , 0 —
ICR1 = 210; // 16 /2·N·ICR1 = 16000 /(2·1·210) = 38095
pinMode(10, OUTPUT); // 10- - 107 1
pinMode(buttonPin, INPUT); //
digitalWrite(buttonPin, LOW); //
buttonState = digitalRead(buttonPin); //
motor1.setSpeed(40); // 40
motor1.release(); //
motor2.setSpeed(15);
motor2.release();
if (buttonState == LOW)
{
mstepx = 140;
nmstepx = 9;
mstepy = 1500;
nmstepy = 2;
}
motor2.step((mstepy*nmstepy/2), FORWARD, DOUBLE); //
motor2.release();
for (int i=0; i <= nmstepx; i++)
{
IR_Sony(); //
motor1.step(mstepx, FORWARD, DOUBLE);
motor1.release();
}
motor1.step((mstepx/2), FORWARD, DOUBLE); // -
motor1.release();
motor2.step(mstepy, BACKWARD, DOUBLE);//
motor2.release();
for (int i=0; i <= (nmstepx-1); i++)
{
IR_Sony(); //
motor1.step(mstepx, FORWARD, DOUBLE);
motor1.release();
}
IR_Sony(); //
motor1.step((mstepx/2), FORWARD, DOUBLE); // -
motor1.release();
if (buttonState == LOW)
{
motor2.step(mstepy, BACKWARD, DOUBLE);//
motor2.release();
for (int i=0; i <= (nmstepx); i++)
{
IR_Sony(); //
motor1.step(mstepx, FORWARD, DOUBLE);
motor1.release();
}
}
motor2.step((mstepy*nmstepy/2), FORWARD, DOUBLE); //
motor2.release();
}

void loop()
{
}

void IR_Sony() // - NEX5
{
digitalWrite(13, HIGH); //
delay(wp); //
digitalWrite(13, LOW);
pulscount=1;
while (pulscount<puls) //
{
OCR1B = 102; //
delayMicroseconds(2432); //
OCR1B = 0; //
delayMicroseconds(576); //
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(640);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(640);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(640);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(640);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(640);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(640);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(640);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(640);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(576);
OCR1B = 102;
delayMicroseconds(1216);
OCR1B = 0;
delayMicroseconds(11136);
pulscount++;
}
digitalWrite(13, HIGH);
delay(wzat); //
digitalWrite(13, LOW);
}

. , . , , , . . RAW + JPEG. RAW , , , , , . , - , . , RAW . , 16 . , .

Reset, , , , 16 , . , . . 16 , . .

hugin
hugin 16 Sony VCL-ECF1

16 3 10 .

hugin

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

, hugin, , , .

. , c Google Street View. , . .

1. RAW TIFF . RawTherapee, DarkTable. , , RawTherapee, DarkTable 0.9.2, . . , . , . , , , .

2. hugin. , , . , - , , hugin, , , .

. EXIF, « » .

hugin

, , , .

«» . - , «». : « » « » , .

«» — CPFind. , .

« » , .

«» , «» ( , ). , , : « », « », «, » « ». , «» .

«» . , .

« » «» — «». « » .

« ». , 360 180 . « ». , « , ». « » .

3. . 16- TIFF, 16- . , , . - CinePaint Krita. Windows , , . , , - . Linux Fotoxx. . , , . , . , , , . , Luminance HDR.

4. . . SaladoConverter, Panotools-Script.

«erect2cubic»:

erect2cubic --erect=panorama.tif --ptofile=cube_project.pto

cube_project.pto. hugin «nona». :

nona -o cube_prefix cube_project.pto

Panotools-Script . «cubic2erect»:

cubic2erect front.tif right.tif back.tif left.tif up.tif down.tif equirectangular.tif
[cubic2erect cube_prefix0000.tif cube_prefix0001.tif cube_prefix0002.tif cube_prefix0003.tif cube_prefix0004.tif cube_prefix0005.tif equirectangular.tif]

. « ».

5. Panini. , . SaladoPlayer. 1.2. , , , 1.0, . Google . « ». , 16 19452×9726 , 180 . , Deep Zoom . Android . , , . , , .

, 16 , , Sony VCL-ECF1. Google.

P. S.

, , . , . . , , . , , , , . , , , , , . , Sony NEX-5 Nikon J1 .

. , , . , , . . . , 10000×5000 . , . .

:

  1. , 2 . 3 , .
  2. , .

:

  1. 10000×5000 — , . , , .
  2. , , , , .
  3. , . , , .

:

  1. JPEG . .
  2. . , , , EXIF.
  3. .

:

  1. . .
  2. .
  3. , , 3 .
  4. , , .

. , . — , , . , , . — , , , . — , . , : . . c , , , , .

, , . , , , , . , , , . , — . , , , , . 6 , , , 6 . . Geeqie c 32- 180 , , 64- — :-) , , , nip2.