3046

Стабилизация по двум точкам

Хочу поделиться своим рецептом стабилизации видео в Adobe After Effects, который я использую для своих таймлапсов. Разработать этот алгоритм мне пришлось из-за того, что я не смог найти ни одной программы, которая бы справилась с такой задачей. Для стабилизации обычным сдвигом кадра в одной плоскости объектив моей камеры слишком широкоугольный и создаёт слишком большие искажения. Необходимо использовать поворот виртуальной камеры с правильным углом обзора и в 3D пространстве.


Способ крайне прост, и я уверен, что «изобрел» велосипед. Если вы знаете, как сделать то же самое проще – напишите в комментариях, я буду благодарен.


Сперва покажу исходный ролик и ролик, стабилизированный при помощи Warp Stabilizer VFX.

В большом разрешении:

https://youtu.be/2KDe7Qx_vtQ

https://youtu.be/LRSzjPILm5Y


Оставлю результат работы стандартного стабилизатора без комментариев и расскажу, как делаю я. Постараюсь расписать всё максимально подробно, чтобы последовательность этих действий мог повторить человек, не знакомый с интерфейсом 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 2One-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. Иначе нужно создать точки на временной шкале и покрутить значения на каждой из них.

Вот и результат всех этих действий:

В 4К-видеоформате


Спасибо за внимание.

Лига фотографов

68.1K постов33.8K подписчиков

Правила сообщества

Правила и рекомендации:

1. Фотографии

Каждая фотография должна содержать тег [моё] и быть хорошего качества.

Не принимаются:

- Размытые фотографии, на которых отсутствует фокус или присутствует смаз, за исключением случаев, когда это является авторской задумкой.

- Фотографии с большим количеством шумов.

- Фотографии с явными провалами в тенях или пересветами.

Все такие фотографии будут перенесены в общую ленту.

2. Описание процесса съемки

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

3. Критика и советы

Если вы хотите получить критику или советы по своей фотографии, добавьте тег "хочу критики".

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

4. Обсуждение моделей

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

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

5. Оскорбления

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

6. Исключения

Посты о фотографах, выставках, техниках, жанрах, оборудовании, а также различные уроки (свои, скопированные, переведенные) являются исключением для пунктов 1-2.

Вы смотрите срез комментариев. Показать все
12
Автор поста оценил этот комментарий

Это кадры с поезда? А так очень кропотливая работа, напишите на reddit, там больше профессионалов в AE сидит.

раскрыть ветку (10)
8
Автор поста оценил этот комментарий
Кадры с капота машины. #comment_49865128

Не люблю Reddit, но об этом подумаю.
раскрыть ветку (9)
3
Автор поста оценил этот комментарий

Там всегда найдутся умельцы, вы им подскажите, они вам. Кто-то подскажет как из этого сделать эффект новый для стабилизации, частенько там сидят разработчики AE, никогда не знаешь насколько ценна ваша работа, пока вы не покажите её профессионалам. Я в этом посте вижу возможность создания автоматизированной стабилизации для тайм-лапс движения - закидываем кадры, а эффект уже автоматически все стабилизирует.

раскрыть ветку (7)
2
Автор поста оценил этот комментарий

Попробую выложить на Reddit. Но не уверен, что получится, и в какой из бессчетного множества разделов выкладывать. Последний раз, когда я контактировал с этим непонятным, неудобным и запутанным сайтом, мои сообщения не были видны никому, кроме меня. Я так и не понял, зачем так сделано и какая магия должна подействовать, чтобы это изменилось.

раскрыть ветку (6)
3
Автор поста оценил этот комментарий
Там запутанная система. Она предлагает сначала контактировать в сообществах словом, а после постами. Я долгое время постоянно добавлял посты, которые удалялись автомодерацией. Но однажды пообщался в теме для набивания рейтинга и поныл на счёт забаненного поста, к счастью там был модератор сообщества и вернул пост, а дальше с рейтингом автомодерация меня уже не трогала. Предлагаю вам сначала найти раздел r/time-lapse набрать в комментах рейтинга, потом начать постить ваши работы с ютьюба или гифкой. Гифки можно сразу кидать в r/gifs, но тоже при достаточном рейтинге, иначе скроет автомодерация. Там очень приятная аудитория, всегда можно найти сабреддит по интересу, ваши работы там оценят в разы лучше чем здесь. А как наберёте рейтинга и набьете руку на изучении ресурса, откопайте раздел по AE для разработчиков, такой раздел для фотошопа там точно есть, и выкладывайте своё творение, желательно видео форматом, на английском, отдача будет колоссальной. Но это если у вас будет желание потратить на это время. Но честно скажу, вы найдёте людей по интересам и они поделятся с вами опытом и вы их научите.
раскрыть ветку (4)
3
Автор поста оценил этот комментарий

Я немного полазил и вспомнил, что проблемы у меня были больше с комментариями. Нашел свой удачный пост, который не был обделен вниманием. Но там я так и не смог ответить ни одному комментатору.

https://www.reddit.com/2vz8aj/


А еще я нашел раздел After Effects. Он почти мертв, выкладывать там бессмысленно...
https://www.reddit.com/r/AfterEffects/

раскрыть ветку (3)
2
Автор поста оценил этот комментарий

Почему-то вас там забанили.
А так 25 тысяч подписчиков немаленькое число для реддита, онлайна мало из-за разницы в часовых поясах. И всегда хороший пост может убежать из сообщества на главную, так больше людей увидит.
Есть ещё такой
https://www.reddit.com/r/AfterEffectsTutorials/

И чем профессиональней сообщество, тем меньше людей, но я думаю вы понимаете почему.  

Иллюстрация к комментарию
раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Аккаунт я удалил сам. Можно сказать, психонул. Комментарии я пытался оставять и пока пост был ещё свежий. И я мог их оставлять, просто никто кроме меня их не видел.

За всю историю сообщества AfterEffects максимальная оценка поста была 443, а наибольшее число комментариев – 56. Не думаю, что мой пост будет читабельнее и его увидет большее число людей. Он просто утонет в безвестности. Заморачиваться ради этого и не стоит.
А AfterEffectsTutorials совсем-совсем мертв.
2
Автор поста оценил этот комментарий

Комментить там нельзя из-за этого.

Иллюстрация к комментарию
1
Автор поста оценил этот комментарий

Волшебник узкой специализации

4
Автор поста оценил этот комментарий
Пожалуйста, добавь тег After Effects, если не трудно)
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку