Стабилизация по двум точкам
Хочу поделиться своим рецептом стабилизации видео в Adobe After Effects, который я использую для своих таймлапсов. Разработать этот алгоритм мне пришлось из-за того, что я не смог найти ни одной программы, которая бы справилась с такой задачей. Для стабилизации обычным сдвигом кадра в одной плоскости объектив моей камеры слишком широкоугольный и создаёт слишком большие искажения. Необходимо использовать поворот виртуальной камеры с правильным углом обзора и в 3D пространстве.
Способ крайне прост, и я уверен, что «изобрел» велосипед. Если вы знаете, как сделать то же самое проще – напишите в комментариях, я буду благодарен.
Сперва покажу исходный ролик и ролик, стабилизированный при помощи Warp Stabilizer VFX.
В большом разрешении:
Оставлю результат работы стандартного стабилизатора без комментариев и расскажу, как делаю я. Постараюсь расписать всё максимально подробно, чтобы последовательность этих действий мог повторить человек, не знакомый с интерфейсом AE.
К инструкции прилагаю и архив с проектом, который пошел на иллюстрации: https://drive.google.com/uc?id=0B-qnBT1qgOj6UjN0SzBuQU43ZWM
Итак, приступим.
0. Для начала настроим After Effects для работы с сериями снимков. Идем в Edit → Preferences → Import и устанавливаем стандартной длиной импортируемых изображений один кадр.
1. Создаем проект:
1.1. Просто перетаскиваем и кидаем папку с серией кадров или видео-файл.
1.2. Добавляем два Null-объекта и две камеры. Первая камера будет лишь местом крепления для основной, второй.
Фокусное расстояние обеих камер должно соответствовать эквивалентному фокусному расстоянию вашего фотоаппарата (28 мм в моём случае). Важно чтобы правильное значение было установлено при создании камер, а не после, иначе они не окажутся в нужном положении.
Camera 1 должна иметь тип Two-Node Camera, а Camera 2 – One-Node Camera.
1.3. Делаем видеоряд и Null-ы трехмерными с помощью соответствующих чекбоксов и не забываем растянуть временные шкалы всех объектов сцены на всю её длину.
2. Теперь сделаем отслеживание двух точек, звезд в данном случае.
2.0. Кликаем правой кнопкой по видеоряду и выбираем из выпадающего списка Track Motion.
2.1. Выберем самую примечательную звезду поближе к краю кадра, но не исчезающую за ним на протяжении всего ролика, и поставим на неё маркер. Размер внешней рамки маркера выберем, глядя на то, как сильно мотало камеру при съемке.
2.2. Запустим отслеживание и дождемся окончания процесса. Возможно, что-то пойдет не так, и придется останавливать, перемещать маркер вручную, менять размер области отслеживания и запускать дальше.
2.3. После завершения процесса нажимаем Edit target... и выбираем Null 1 и тыкаем OK.
2.4. Нажимаем Apply, оставляем X and Y как есть, OK.
2.5. Повторяем всё с пункта 2.0. по 2.4. для Null 2. Вторую точку лучше выбрать поближе к другому краю кадра. Чем больше расстояние между точками – тем лучше.
Примерно так должен выглядеть предпоказ сцены с двумя Null-объектами и их траекториями после всех описанных выше манипуляций:
3. Далее необходимо привязать Point of Interest камеры 1 к Null 1.
3.0. Нужно раскрыть свойства вышеуказанных объектов как на иллюстрации чтобы было удобно с ними работать.
3.1. Зажимаем Alt и кликаем по значку с часами в строчке Point of Interest., появляется строка expression.
3.2. Из неё тянем кнопку в виде спирали и вешаем связь на строку Position в свойствах Null 1.
4. Теперь так же, с помощью Alt и клика по иконке часов, открываем окно expression параметра Z Rotation у Camera 1. В этот раз заполняем блок ввода (Ctrl+C, Ctrl+V) следующим кодом, решающим матричное уравнение:
xA = thisComp.layer("Null 1").transform.position[0] - transform.position[0];
yA = thisComp.layer("Null 1").transform.position[1] - transform.position[1];
zA = 0;
xB = thisComp.layer("Null 2").transform.position[0] - transform.position[0];
yB = thisComp.layer("Null 2").transform.position[1] - transform.position[1];
zB = 0;
xC = 0;
yC = 0;
zC = transform.position[2];
xn = xA - xC;
yn = yA - yC;
zn = zA - zC;
A1 = xn;
B1 = yn;
C1 = zn;
D1 = -xC * xn - yC * yn - zC * zn;
A2 = (yB - yA) * (zC - zA) - (zB - zA) * (yC - yA);
B2 = - (xB - xA) * (zC - zA) - (zB - zA) * (xC - xA);
C2 = (xB - xA) * (yC - yA) - (yB - yA) * (xC - xA);
D2 = -xA * ((yB - yA) * (zC - zA) - (zB - zA) * (yC - yA)) + yA * ((xB - xA) * (zC - zA) - (zB - zA) * (xC - xA)) - zA * ((xB - xA) * (yC - yA) - (yB - yA) * (xC - xA));
xD = -D1 / A1;
yD = 0;
zD = 0;
xE = (B2 * D1 / B1 - D2) / (A2 - B2 * A1 / B1);
yE = - (A1 * xE + D1) / B1;
zE = 0;
ED = Math.sqrt(Math.pow(xE - xD, 2) + Math.pow(yE - yD, 2) + Math.pow(zE - zD, 2));
DC = Math.sqrt(Math.pow(xD - xC, 2) + Math.pow(yD - yC, 2) + Math.pow(zD - zC, 2));
CE = Math.sqrt(Math.pow(xC - xE, 2) + Math.pow(yC - yE, 2) + Math.pow(zC - zE, 2));
EDC = Math.acos((Math.pow(DC, 2) + Math.pow(CE, 2) - Math.pow(ED, 2)) / 2 / DC / CE) / Math.PI * 180;
if ((xE > xD && yE > yD) || (xE < xD && yE < yD)) EDC;
else - EDC;
5. Перемотаем время на самое начало и прикрепим камеру 2 к камере 1. Для этого просто выберем Camera 1 из выпадающего меню Parent в строке Camera 2.
Если всё прошло гладко, то теперь камера 2 намертво прибита к звездному небу. Её начальное положение соответствует первому кадру серии, а потом она сваливается куда-то вбок.
6. Настраиваем направление и угол обзора камеры 2. Тут всё делается на глаз.
6.1. Раскроем её свойства и покрутим значения углов поворота (X/Y/Z Rotation или Orientation). Если крутить их с зажатым Ctrl, то значения будут меняться плавнее. Важно не менять расположение камеры, оно должно быть 0, 0, 0.
6.2. Изменим фокусное расстояние и, соответственно, угол обзора камеры так, чтобы в кадре не появлялись черные области фона. Делается это в настройках из, пункта 1., которые появятся по двойному клику по камере. В данном случае фокусное расстояние пришлось увеличить с 28 до 31 мм, угол обзора при этом уменьшился с 65.5° до 60.3°.
Если целью было обездвижить звездное небо, то нужно убедиться, что область обзора вписывается в кадр на всей длине видеоролика.
6.3. Иначе нужно создать точки на временной шкале и покрутить значения на каждой из них.
Вот и результат всех этих действий:












Лига фотографов
68K постов33.8K подписчика
Правила сообщества
Правила и рекомендации:
1. Фотографии
Каждая фотография должна содержать тег [моё] и быть хорошего качества.
Не принимаются:
- Размытые фотографии, на которых отсутствует фокус или присутствует смаз, за исключением случаев, когда это является авторской задумкой.
- Фотографии с большим количеством шумов.
- Фотографии с явными провалами в тенях или пересветами.
Все такие фотографии будут перенесены в общую ленту.
2. Описание процесса съемки
Приветствуется описание процесса съемки, условий, места и минимальной информации о технике, на которую была сделана фотография.
3. Критика и советы
Если вы хотите получить критику или советы по своей фотографии, добавьте тег "хочу критики".
Если на фотографии нет тега "хочу критики", но вам хочется сделать несколько замечаний по опубликованной работе, то лучшим решением будет спросить у автора, не хотел бы он получить конструктивную критику. И только получив утвердительный ответ, размещайте ваши замечания и советы в комментариях.
4. Обсуждение моделей
В сообществе запрещается грубое обсуждение моделей, включая такие комментарии, как "толстая", "страшная", "худая" и т.д.
Все комментарии подобного рода будут скрываться, а пользователь будет заблокирован.
5. Оскорбления
Запрещается прямое или косвенное оскорбление участников сообщества и их работ, а также язвительный тон и использование ненормативной лексики. Комментарии подобного рода будут также скрываться, а пользователь будет заблокирован.
6. Исключения
Посты о фотографах, выставках, техниках, жанрах, оборудовании, а также различные уроки (свои, скопированные, переведенные) являются исключением для пунктов 1-2.