Стабилизация видео


Введение

Данная статья посвящена исследованию вопроса о программной стабилизации видео. Не секрет, что одно из основных отличий профессиональной съёмки (в частности, кино) от любительской заключается в том, что профессионалы, как правило, снимают со штативами, кранами, тележками и прочими приспособлениями, обеспечивающими неподвижность или плавное движение камеры, тогда как любители обычно об этом не задумываются. Как следствие, часто в любительской съёмке происходит такое мельтешение в кадре, что после нескольких минут просмотра начинает болеть голова, или во всяком случае пропадает желание смотреть на экран. Рецепт профессионалов, конечно, годится и для нас, простых видеолюбителей — надо учиться снимать со штативом. Однако не всегда он есть под руками, да и некоторые сюжеты нельзя толком снять с использованием штатива (а кран и тележка уже, увы, для любителей практически недоступны). Что же делать с таким видеорядом? Существуют достаточно мощные возможности по стабилизации изображения уже на этапе компьютерной обработки, и о них пойдёт речь в этой статье (во второй её части). Но сначала некоторое теоретическое введение.

Теоретическая часть

Для начала определим фундаментальный механизм работы любой системы стабилизации. Он имеет как минимум две составляющие: определитель «дрожания» и собственно механизм восстановления кадра без дрожания. При этом под дрожанием обычно подразумевается нежелательное беспорядочное движение самой камеры. А точнее, вращение камеры относительно любой из трёх осей, проходящих через её центр. Вращение относительно главной оптической оси (той, которую протирают спиртом:) приводит к вращению кадра (впрочем, это редко заметно), остальные две оси дают смещение по горизонтали и вертикали. Нужно иметь в виду, что помимо движения кадра как целого (движения фона), обусловленного в том числе и дрожанием камеры, часто ещё движется и объект в кадре относительно фона. Это создаёт одну из главных проблем при стабилизации в сколько-нибудь сложных случаях.

Стабилизаторы в видеокамерах

Перед тем, как перейти к разговору о программных стабилизаторах, вспомним, как осуществляется стабилизация при съёмке. Об одном, самом надёжном методе — механическом — я уже упомянул; помимо него, есть ещё два: оптический и цифровой стабилизатор. Их механизм работы отличается в обоих составляющих.
Оптический стабилизатор состоит из детектора движения (вращения) камеры — системы гироскопов, регистирующих ускорение, и компенсирующей линзы, которая может смещаться перпендикулярно оптической оси и отклонять лучи света в противофазе к обнаруженному смещению, так что они попадают в одну и ту же область на матрице. Снятие показаний с датчиков ускорения и соответственно смещение линзы происходит несколько сот раз в секунду, т.е. много раз за время экспонирования кадра, что позволяет избежать не только нежелательного сдвига картинки между кадрами, но и размытия её в пределах одного кадра (при сильном рывке). Кстати, аналогичную функцию выполняют оптические стабилизаторы в фотоаппаратах, где нет проблемы «межкадрового сдвига».

Цифровой стабилизатор определяет смещение по анализу изображения, получаемого с матрицы. Для этого, разумеется, её реальный размер должен быть существенно больше эффективного, чтобы при небольших смещениях кадр не вылетал за пределы матрицы. Записывается же на носитель изображение с меньшей по размеру области, которая «прыгает» по матрице от кадра к кадру согласно определённому вектору смещения. Недостатки у этого метода по сравнению с оптической стабилизацией очевидны: во-первых, используется не вся площадь матрицы, что приводит к ухудшению соотношения сигнал/шум при недостаточной освещённости, во-вторых, нет возможности устранить внутрикадровое размытие (которое, впрочем, досаждает только при длинных выдержках и достаточно сильной трясучке). Кроме того, стабилизатор не может предугадать, является ли смещение случайным дрожанием либо началом целенаправленного движения камеры (например, панорамы). Это иногда приводит к эффекту «залипания», когда при начале панорамирования кадр некоторое время удерживается на месте стабилизатором, а при достижении предела (края матрицы) может резко прыгнуть. В оптической системе стабилизации такого эффекта почему-то не наблюдается, хотя возможности предсказать движение камеры нет и там.

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


Спектр колебаний кадра с включённым и выключенным накамерным стабилизатором, а также после программной стабилизации

На нём представлены частотные спектры смещений камеры, определённые с помощью анализа движения в фильтре Deshaker, о котором мы поговорим во второй части статьи. Съёмка с рук удалённого неподвижного объекта производилась камерой Canon XM-2 на максимальном (20х) приближении с включённым и выключенным оптическим стабилизатором. Надо сказать, что камера эта достаточно тяжёлая (1,5 кг) по сравнению с современными «пушинками», которые, следовательно, больше подвержены тряске. Видно, что оптический стабилизатор подавляет колебания с частотой выше 1-2 герц, что, безусловно, положительно сказывается на изображении, однако недостаточно для комфортного восприятия — картинка субъективно остаётся неприятно плавающей. После программной обработки фильтром Deshaker с параметрами, подобранными для визуально приятного результата, амплитуда колебаний уменьшилась ещё в несколько раз, а колебания с частотами больше 0,5 гц вовсе исчезли. То есть и при наличии стабилизатора в камере программная обработка часто бывает очень полезна. Рассмотрим же подробнее, что она нам может дать.

Программная стабилизация: основные принципы

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


Пример заполнения границ участками из соседних кадров. При грамотном подходе всё работает отлично, кроме движущихся объектов (нога внизу)

Методы определения движения, как правило, работают аналогично методам, применяющимся при MPEG-подобном сжатии. То есть кадр разбивается на блоки, для каждого из них находится наиболее похожий блок в предыдущем кадре и смещение относительно него. По построенной карте смещений определяются усреднённые характеристики для всего кадра. Как правило, это две-четыре величины: смещение по горизонтали и вертикали и часто поворот и изменение масштаба. (Хотя в реальной съёмке регулятор зума не дрожит, тем не менее удобнее аппроксимировать карту смещения четырьмя, а не тремя величинами). При этом можно отбрасывать те блоки, которые движутся в явном несогласии с общим направлением, т.к. они наверняка соответствуют движению отдельных объектов в кадре относительно фона, либо же просто неправильно отождествлены в предыдущем кадре. Есть и другие (не-поблочные) подходы, например, применённый в фильтре DePan фурье-анализ, но на выходе обычно получаются те же величины. Дальше в действие вступает модуль собственно стабилизации, который строит оптимальную траекторию камеры путём сглаживания имеющейся «хаотической», выполняет смещение, поворот и масштабирование кадров на соответствующие величины, заполняет края и т.д. Выбор оптимальной сглаженной траектории похож на применение низкочастотного фильтра к «сигналу», образованному векторами смещения, т.е., по сути, убираются колебания с частотами выше частоты среза, задаваемой пользователем. Низкочастотные колебания, как правило, соответствуют более-менее целенаправленному движению камеры. (В качестве примера рассмотрим следующий видеосюжет: камера некоторое время неподвижно смотрит в одну точку, а затем резко начинает панорамирование с постоянной скоростью. Оба интервала соответствуют нулевой частоте «колебаний», а переход между ними и есть «дрожание»: чем ниже частота среза, тем плавнее после стабилизации будет начало движения).

Хочу подчеркнуть, что для полноценного использования всех возможностей программной стабилизации фильтр должен быть эффективно двухпроходным: на первом этапе строятся вектора смещения для всех кадров клипа, на втором — вычисляется оптимальная траектория и выполняется стабилизация. На самом деле необязательно обрабатывать весь клип, достаточно «заглянуть вперёд» хотя бы на несколько секунд. Но и этим могут похвастаться далеко не все фильтры, а ведь без этого их работа будет не сильно интеллектуальнее накамерного стабилизатора.

Возможные артефакты стабилизации

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

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

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

Ещё одна неприятность полностью унаследована из цифрового накамерного стабилизатора: при недостаточно короткой выдержке и достаточно резком смещении кадр «поплывёт», будучи даже смещён обратно в нужное положение при стабилизации. Это выглядит как резкая кратковременная расфокусировка, хотя размытие и происходит только в одном направлении. Впрочем, большинство зрителей посчитают это менее неприятным, чем исходный рывок кадра. Чтобы минимизировать этот эффект, лучше сразу при съёмке установить выдержку поменьше (автомат камеры, как правило, при уменьшении освещённости сначала поднимает выдержку до 1/50 секунды и лишь затем открывает диафрагму; мы же желаем сделать наоборот, поставить выдержку, скажем, на 1/200 или хотя бы 1/100, а диафрагма пусть будет пошире).

Наконец, ещё один эффект возникает, когда мы стабилизируем видео, снятое на широком угле (при минимальном зуме). Спрашивается, разве такое нужно? В некоторых ситуациях — да, см. ниже. Здесь мы сталкиваемся с той же ситуацией, что и фотограф, пытающийся просто склеить панораму в Photoshop'е: в соседних кадрах будет различная перспектива, и без компенсации перспективных искажений панорама не склеится.

Все программы для работы с фотопанорамами используют компенсацию перспективных искажений, но для этого нужно знать фокусное расстояние (или угол обзора кадра), что в фотографии достигается простым чтением EXIF-параметров файла (или задаётся вручную), а в случае с видео практически недостижимо. Поэтому при стабилизации такого видео мы можем наблюдать странные «покачивания» картинки, как будто кратковременно одна сторона кадра к нам приблизилась, а другая удалилась.


Иллюстрация перспективных искажений: два кадра сдвинуты до совпадения центров, но по краям выглядят по-разному

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

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

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

Режимы применения стабилизаторов

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

1. Съёмка на максимальном зуме более-менее неподвижного объекта, или же панорама (при большом и не очень приближении, а то и вовсе на минимальном зуме). Отличительные особенности — всё нерегулярное движение в кадре относится на счёт дрожания камеры, а после стабилизации мы должны получить почти неподвижную картинку или равномерно прокручивающуюся панораму. Кстати, случай с панорамой, пожалуй, не менее важен — с рук, да и с обычного недорогого штатива, практически невозможно снять её равномерно и без рывков даже на самом широком угле; смотрится это довольно удручающе, но после стабилизации комфортность восприятия улучшается кардинально. Этот случай — самый простой для стабилизатора, с применением компенсации краёв мы практически ничего не теряем.

2. Не очень большой зум, но заметное движение центрального объекта в кадре относительно фона. Например, скатывающийся по склону лыжник или проезжающий автомобиль. Здесь процедуре анализа движения придётся изрядно подумать, чтобы отделить объект от фона. В сущности, привязываться по движению можно и к тому, и к другому, но привязка к фону выглядит более естественной в случае, когда в движении объекта имеются заметные нерегулярности (тогда камера движется более равномерно вместе с фоном). Главное, чтобы привязка не прыгала от кадра к кадру — в одном фон занимал больше места и движение определялось по нему, а в другом — «внимание» стабилизатора переключилось на объект. Впрочем, в более простых алгоритмах этой проблемы как бы нет - вектора движения усредняются по всему кадру, но и это может выглядеть не очень хорошо. Ещё одна неприятность возникает при попытке компенсировать границы у движущегося объекта (об этом мы говорили выше). В общем, при съёмке надо делать зум немножко меньше, чем хотелось бы для полного влезания объекта в кадр.

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

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

Итак, настала пора закончить с теорией и перейти к практическому рассмотрению нескольких фильтров стабилизации.

Практика стабилизации

Суха теория, друзья, а древо жизни зеленеет!.. Описанные основные идеи программной стабилизации помогут нам лучше понять, как настраивать конкретные имеющиеся фильтры стабилизации. Мы подробно рассмотрим один из лучших на сегодняшний день фильтров - Deshaker для VirtualDub, а также набор функций для AviSynth, реализованный в плагинах DePan и MVTools. Все эти программные продукты бесплатны и легко доступны на соответствующих сайтах, к тому же постоянно развиваются. Помимо них, фильтры стабилизации есть во многих программах монтажа, но они небесплатны, а работают, как правило, хуже (вот парадокс?). Среди коммерческих плагинов мы рассмотрим Mercalli — вполне качественный продукт от компании proDAD, доступный для нескольких популярных программ видеомонтажа.

Deshaker — фильтр для VirtualDub

Фильтр Deshaker — это, на мой взгляд, самый мощный инструмент для стабилизации. Дело в том, что у него огромное количество настроек, при правильном применении которых (в том числе с разными настройками для разных участков клипа) можно добиться почти чего угодно (в смысле стабилизации). Фильтр относится к числу двухпроходных, как и положено всякой серьёзной программе такого рода. На первом этапе производится анализ движения (поблочный), и вычисленные для всего кадра величины сдвига, поворота и масштабирования записываются в текстовый log-файл. На втором проходе выполняется собственно стабилизация с использованием адаптивного зума, заполнения краёв и прочими вкусностями. Фильтр разрабатывается человеком по имени Gunnar Thalin и доступен по адресу www.guthspot.se. Итак, будем предполагать, что вы уже знакомы с VirtualDub (если нет, читайте соответствующую статью). Загружаете исходный клип в программу и в диалоге фильтров добавляете Deshaker. Открывается окно с большим количеством настроек, которые мы сейчас разберём подробно.


Окно настроек Deshaker

Как можно видеть, настройки собраны в три группы: общие для обоих проходов и отдельно для первого и второго (переключается кнопками Pass 1 и Pass 2 вверху). Из общих надо выставить Source pixel aspect — параметр «неквадратности пиксела»: для видео 4:3 с miniDV или другой камеры стандартного разрешения это будет Standard PAL, для широкоэкранного с такой же камеры — Anamorphic PAL, для видео с камер высокого разрешения или фотоаппарата, как правило, оставить вариант по умолчанию Square pixels. Не менее важно задать тип чересстрочного сигнала — для камер miniDV это Interlaced, lower field first, для большинства камер High definition – upper field first, для фотоаппарата и прогрессивного режима (или frame mode) в видеокамерах — Progressive scan. Также нужно обратить внимание на опцию Camcorder has a rolling shutter (это утверждение справедливо для большинства современных устройств, оснащённых матрицами CMOS, и не подходит для камер на матрицах CCD). Сам термин rolling shutter обозначает особенность работы электронного затвора матрицы, состоящую в том, что сигнал считывается последовательно, начиная, как правило, с верхней строчки кадра. Таким образом, изображение в пределах одного кадра на самом деле относится к разным моментам времени, что может вызвать искажения в случае быстро перемещающихся объектов либо самой тряски камеры (в народе известные под названием «желе»). При включении этой опции движение кадра будет интерполироваться построчно между двумя крайними значениями, что позволяет частично бороться с артефактами rolling shutter'а (хотя это не всегда работает хорошо, см. ниже в разделе «сложные случаи»). Также нужно задать величину временной задержки между первой и последней строкой (в процентах, значения для некоторых распространённых моделей камер и рецепт по самостоятельному её вычислению приведен на странице автора фильтра).

Настройки первого прохода

Настройки первого этапа в основном призваны улучшить качество определения движения на первом проходе. Мы рассмотрим их чуть позже, а пока обратим внимание на верхнее поле: Video output можно установить в none — тогда на выходе будет чёрный квадратик 8x8 пикселей (это удобно для пакетной обработки через VirtualDub Job control), или же оставить значение по умолчанию Motion vectors, что позволит любоваться векторами движения поверх картинки (и не только любоваться, а и делать соответствующие выводы, правильно ли работает анализатор движения). Если что-то идёт не так, то настала пора менять настройки из группы Image matching parameters. А пока закроем окно фильтра и запустим первый проход. Поскольку результат всё равно никуда не нужно сохранять (только разве смотреть на экране), то имеет смысл запускать либо Preview output from start (F5), либо кнопку , либо просто прокручивать стрелкой влево, если нам нужен только небольшой фрагмент. (Вообще обычно log-файл очищается при каждом начале работы первого этапа, но это можно изменить включением галки Append to log file). На протяжении первого этапа вы будете наблюдать на экране подобную картинку:


Видеоряд на первом проходе: векторы движения

(Если видео было чересстрочным, то кадр разбивается на два поля и все параметры определяются отдельно для них, а изображаются они друг под другом соответственно сплюснутыми вдвое по вертикали). Итак, белые стрелки показывают вектора движения, определённые для каждого блока (его размер задаётся в графе Block size параметров первого прохода и по умолчанию равен 30 пикс.) Если стрелка красная, то данный блок отбраковывается и не участвует в определении общего движения кадра (блок настроек Discard motion of blocks that..), потому что либо его движение слишком противоречит общему направлению (графа Move >X pixels in wrong direction), либо просто слишком велико (Move >X pixels (absolute motion)). Некоторые блоки вообще не имеют векторов движения, если их не удалось надёжно отождествить в предыдущем кадре (например, равномерно синее небо). Их отбраковкой управляют первые два пункта из раздела Discard motion of blocks. Если количество нормальных (белых) блоков недостаточно (задаётся параметром Skip frame if <X % blocks are ok, по умолчанию 8%), то кадр пропускается (если при этом он в целом сильно отличается от предыдущего точнее, то считается началом новой сцены), иначе для него вычисляются и записываются в log-файл величины сдвига центра, поворота и масштабирования (выводятся также в строке под кадром; если она красная или жёлтая, то хороших блоков слишком мало).

Настройки второго прохода

Первый этап закончился — переходим ко второму (нажав соответственно кнопку Pass 2 в диалоге фильтра). Здесь можно настроить размер выходного изображения (обычно он равен входному, что и задано по умолчанию), метод масштабирования (bicubic по умолчанию - не надо менять), режим работы с границами.

Пункт Edge compensation управляет режимом использования дополнительного зума: None (large borders) отключает эту функцию, Adaptive zoom (два режима – average и full) использует плавно меняющийся (адаптивный) зум, Fixed zoom выбирает наиболее подходящее постоянное значение зума, которое полностью убирает пустые края. В режиме адаптивного зума для каждого кадра выбирается необходимое значение увеличения (с учётом уже стабилизированного движения и поворота), после чего эти величины сглаживаются по времени, чтобы не было резких рывков между соседними кадрами (степень сглаживания регулируется параметром adaptive zoom smoothness), в результате чего пустые края всё-таки могут появиться в режиме adaptive zoom average. Adaptive zoom full отличается тем, что в участках с резким движением добавляет несколько больше увеличения, чтобы края не возникали даже после сглаживания. А в режиме adaptive zoom average + fixed zoom это дополнительное увеличение просто постоянно в пределах сцены (т.е. в среднем несколько больше, чем при adaptive zoom full).

Так вот, после стабилизации кадра возникают незаполненные края, частично (но не всегда полностью) убираемые зумом. Deshaker - практически единственный фильтр, который умеет их заполнять пикселями из соседних кадров, причём соответствующим образом сдвинутыми/повёрнутыми. Этим управляет пункт Use previous and future frames to fill borders. Здесь вы можете задать число соседних (предыдущих и следующих) кадров, используемых для компенсации краёв. Величины по умолчанию 30 кадров вполне подходят для большинства сюжетов, при очень плавном движении можно их и увеличить. Пункт Soft borders управляет ещё одной «фишкой» заполнения краёв: при выключенной галке для заполнения используется участок из ближайшего по времени подходящего кадра (т.е. просматриваются кадры №n-1, n+1, n-2, n+2 и т.д., пока не будет найден присутствующий в кадре кусок изображения). При включении Soft borders для вычисления значения пикселя используются все подходящие кадры, а не только ближайший. Они усредняются с различным весом — более важны кадры, расположенные ближе по времени. Кроме того, усреднение происходит не только по времени, но и по пространству — пункт Edge transition width определяет, с какого расстояния от границы начнётся усреднение. В целом, эта функция делает края более размазанными, но при этом позволяет избежать резких переходов, что в целом положительно сказывается на восприятии изображения. Правда, при наличии широких границ обсчёт происходит весьма медленно.


Режимы заполнения пустых границ

Дополнительно можно задать метод заполнения краевых пикселей, которые не могут быть зарисованы иным образом, путём экстраполяции значений граничных пикселей (галка Extrapolate colors into border). Впрочем, смотрится это не так здорово, как компенсация из соседних кадров, и обычно в ней не возникает нужды. Кроме того, если размазанные края всё-таки мешают, то можно задать дополнительный зум в графе Extra zoom factor, например, величину 1.05 или что-нибудь в этом духе. Это тоже не самый лучший выход — стоит попытаться сначала поварьировать параметры плавности.

Степень стабилизации регулируется параметрами плавности (Motion smoothness) — отдельно для горизонтального и вертикального движения, поворота и масштабирования. В отличие от других фильтров, где, как правило, регулируется частота среза высокочастотных колебаний, в Deshaker применён иной подход: перед началом второго прохода для всего клипа вычисляется оптимальная траектория камеры, т.е. минимизирующая одновременно и кривизну траектории, и отклонение её от реальной (создающее пустые края). Эти параметры являются весовыми коэффициентами в минимизирующей функции. Они могут варьироваться в широких пределах (от 0 до 100000), большее значение соответствует большей плавности. Величины по умолчанию (1000) вполне подходят для большинства сюжетов, хотя их можно и увеличить в несколько раз (зависимость «плавности» от них, видимо, довольно пологая). При выборе значений можно руководствоваться следующим эмпирическим правилом: чем больше плавность движения в исходном видео, тем большие значения можно безболезненно задавать. Т.е. для панорам вполне сгодятся значения 10000, а для съёмок стремительного спуска с горы, держа камеру в руках, такая плавность приведёт, во-первых, к неоправданно большим областям по краям кадра, требующим заполнения (что чревато артефактами в случае такого сложного движения), и во-вторых, уменьшит зрелищность сюжета:). Для таких динамичных съёмок подойдут величины порядка 1000. Если вы видите, что при заданных значениях остаются слишком много областей по краям, требующим заполнения, то плавность стоит уменьшить (или включить дополнительный зум). Впрочем, есть ещё средство для урегулирования быстрых рывков: группа параметров Max correction limits, задающая пределы смещения/поворота при вычислении оптимальной траектории. Их действие состоит в том, что при резких рывках, когда невозможно обеспечить одновременно и плавность траектории, и невыход за пределы смещения, параметры плавности на короткое время уменьшаются по сравнению с заданными. Ещё нужно отметить, что траектория рассчитывается по кадрам, а не по времени (для интерлейсного видео — по полукадрам). Т.е. для получения той же плавности в случае интерлейсного видео нужно установить вдвое большие значения, чем для прогрессивного с той же частотой кадров.

Итак, параметры второго прохода настроены, можно запускать. Устанавливаем кодек для видео — и в путь. Перед началом второго этапа происходит вычисление оптимальной траектории камеры для всего клипа, что может занять продолжительное время (особенно при больших параметрах плавности), но обычно сам второй проход длится намного дольше. В это время на экран выводится табличка «Deshaking». Когда вычисления готовы, можно начинать второй проход.

Резюме по применению

Итак, суммируя изложенное, последовательность действий для работы с Deshaker такова:

  1. Открываем исходный файл в VirtualDub, добавляем фильтр Deshaker, настраиваем общие параметры — Source pixel aspect, Video type, при необходимости — rolling shutter; настройки первого этапа можно не трогать.
  2. Запускаем первый проход нажатием F5 либо выбором run video analysis pass, откидываемся на спинку стула, пьём чай, при желании — наблюдаем за векторами смещения.
  3. Заходим в настройки фильтра, включаем второй проход, выбираем подходящий режим заполнения краёв (edge compensation) – в большинстве случаев хорошим вариантом будет adaptive zoom average или full, ставим подходящие значения плавности (Motion smoothness), например, по 5000. Если режим работы с краями установлен в none или adaptive zoom average, то включаем галку Use previous and future frames, можно также включить Soft borders (хотя это сильно замедляет работу).
  4. Сохраняем клип (не забыв выбрать кодек для видео), смотрим его в плеере, проверяем адекватность результата; при необходимости меняем настройки второго прохода и сохраняем; если заметны дёргания или другие признаки неправильного определения движения, то придётся подкорректировать первый проход.

Сложные случаи

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

Прежде всего, если что-то не устраивает, то надо определить причину. Их может быть две: неподходящие настройки второго этапа проявляются в основном в том, что возникают артефакты по краям изображения, связанные с компенсацией границ при наличии заметного движения около них между кадрами. Ещё раз подчеркну, что применяемый в Deshaker метод заполнения границ не имеет аналогов среди доступных фильтров, но и он не всегда даёт хороший результат. В таком случае надо просто уменьшить эти границы либо введением дополнительного зума, либо снижением плавности (в т.ч. и кратковременным, за счёт Max correction limits). Это было рассмотрено в секции про второй проход.

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


Правильно определенное общее движение фона

Неправильно определённое движение - смесь фона с движущимся объектом

В приведённых последовательных кадрах движение камеры было примерно одинаковым, но в первом случае оно определилось правильно по движению фона, а во втором — неправильно, захватив объект и вынужденно выкинув часть фона. На самом деле в последних версиях Deshaker такая ситуация, скорее всего, не возникнет благодаря более «интеллектуальной» системе слежения за объектом на фоне, выраженной в галке Remember discarded areas to next frame. По умолчанию она включена и призвана сосредоточиться на движении фона, даже если объект, постепенно увеличиваясь, занимает бОльшую часть кадра. Другая полезная «ручка», применение которой может дать нужный эффект, но сильно замедлить работу, — Deep analysis if <X % of blocks are OK. Если в этом поле стоит ненулевое значение (скажем, 25%), то при количестве «белых» векторов, меньших заданного (в процентах от общего числа блоков с определёнными векторами движения, а не от всех блоков), то включается механизм "глубокого анализа", который перебирает различные гипотезы относительно движущихся в разные стороны объектов и может сосредоточиться на фоне, даже если он занимает небольшую площадь (при включённом remember discarded areas этот режим не работает, т.к. он не учитывает «историю» движения).

С этими установками связаны настройки отбрасывания векторов движения, не подходящих под общую картину. Discard motion of blocks that move > X pixels in wrong direction управляет отбраковкой таких блоков (они становятся красными). Если камера находится в одной точке и общий фон не движется существенно (как, например, листва в лесу на ветру), то движение блоков фона должно очень хорошо описываться общими значениями смещения/поворота, поэтому этот параметр можно снизить до 1, выкидывая т.о. всё что не относится к фону. (При этом можно и задать размер блока (Block size) поменьше, например, 16-24 пикс.) С другой стороны, если камера движется относительно фона, то можно и задать побольше значение в этой графе, чтобы «ловить» побольше векторов движения.

Также существует и более ручной способ управлять отбрасыванием разных частей кадра, задавая игнорируемые области в секции Ignore pixels inside ... и outside ... Например, если снимать в движении, то в нижней части кадра наверняка будут объекты переднего плана, движущиеся относительно «неподвижного» фона. Их можно отрезать, задав значение в поле Outside / Bottom. С другой стороны, «мешающий» объект в центре кадра можно попытаться ликвидировать через Ignore pixels inside. Правда, если он реально движется по кадру, то довольно скоро выйдет за пределы игнорируемой области или же придётся задавать её слишком большой, что нежелательно. С другой стороны, обычно это требуется максимум для нескольких кадров подряд, так что можно прогнать их с нужной установкой и подклеить соответствующие значения в общий log файл. В конечном итоге, надо добиваться того, чтобы все белые вектора относились к фону, а красные или отсутствующие — к движущимся объектам. Хотя в некоторых ситуациях может оказаться предпочтительнее следить за движением объекта, а не фона.

Если фон малоконтрастный (небо, снег), то для многих блоков не могут быть достоверно вычислены вектора движения, т.к. не удаётся точно отождествить их в предыдущем кадре. Такие блоки вообще не будут иметь векторов движения. Если хочется как-то ослабить эту отбраковку, можно поиграть значениями в полях Discard motion of blocks that have match value <X и that have 2nd best match > best — Y. Если определённых векторов движения слишком мало (особенно если меньше, чем задано в графе Skip frame if < X % blocks are OK, что приведёт к пропуску анализа кадра), то нужно попытаться уменьшить «критичность» отбраковки путём уменьшения этих двух параметров. Кроме того, по умолчанию не используются слишком тёмные области (Ignore darker than ..), т.к. в них невелика контрастность и много шумов. Также можно применить такой трюк: на первом этапе добавить в цепочку фильтров перед Deshaker что-нибудь типа Levels или Brightness/Contrast, и «разогнать» контрастность для нужных областей (светлых или тёмных), чтобы детектор движения лучше работал. Перед вторым проходом, конечно, дополнительный контраст нужно удалить.

Отдельного внимания заслуживает работа с rolling shutter. Если в вашей камере имеется этот эффект (к сожалению, для подавляющего большинства современных камер это так), эта опция во многих случаях помогает бороться с артефактами, вызванными перемещением самой камеры (но, конечно, не объектов внутри кадра), но только если частота дрожания была не слишком высокой, иначе движение камеры нелинейно меняется уже в пределах длительности одного кадра. Однако из-за того, что при этом из исходного видеоряда нужно вытащить вдвое больше параметров (значения смещения независимо для верхней и нижней строки, которые интерполируются для всех промежуточных), иногда это может приводить к негативным результатам. Например, при съёмке из окна автомобиля верхняя часть кадра обычно будет содержать относительно неподвижный дальний план, а нижняя – ближний (дорогу и кусты), движущийся относительно верха. Эта разница в движении будет отнесена на счёт rolling shutter'a, что, конечно, не соответствует действительности и может привести к артефактам при попытке её скомпенсировать. Так что применять эту опцию нужно с осторожностью.

Также несколько слов следует сказать по поводу стабилизации зума. Вообще говоря, управление зумом на камере по конструкции не допускает резких рывков, поэтому нужды стабилизировать зум может и не возникнуть (для этого достаточно установить значение плавности для зума в 0). Иногда – например, при движении самой камеры вперёд – анализатор движения будет считать, что камера «наезжает» на объект; с точки зрения стабилизации это может быть как удобно, так и нет. В любом случае, для видео, в котором заведомо нет наездов-отъездов камерой и заметного движения камеры или объектов вдоль линии съемки, можно отключить определение зума (и/или вращения) на первом этапе соответствующими галочками (при этом, естественно, могут измениться определяемые величины смещения и отбрасываемые из-за несоответствия общему движению блоки).

Для всех тонких настроек лучше выставить в максимум поля Scale (=Full) и Use pixels (=All), хотя это замедляет обработку в 2-3 раза. В конечном итоге, ничто не мешает проводить тонкую настройку параметров для отдельных участков клипа, проходить по этим участкам вручную (стрелкой вправо) и затем совмещать полученные значения с основным log-файлом (который, конечно, надо сохранить под другим именем). Формат этого файла текстовый и довольно очевидный — в каждой строке идут величины смещения по X, Y, вращения и зума для данного кадра (если видео было чересстрочным — то две строки, отдельно для первого и второго по времени поля; при включённой опции rolling shutter в каждой строке приводятся значения отдельно для верхней и нижней части кадра). Кадры, для которых не удалось определить движение из-за слишком малого количества валидных блоков, помечаются словом skipped – для них (а также для пропущенных строк) на втором проходе значения смещения будут интерполироваться. Начало новой сцены отмечено словом n_scene – все кривые сглаживания и компенсация краёв действует отдельно в пределах каждой сцены.
При «ручном управлении», т.е. обработке разных участков клипа с разными параметрами первого прохода, в принципе, можно использовать опцию Append to file (для кадров, встретившихся в log-файле несколько раз, будет использована последняя запись), но лучше всё же сохранять отдельные куски лога в другой файл и затем вклеивать в основной только нужные кадры.

Пару слов об организации «техпроцесса». Ясно, что лучше стабилизировать отдельные сюжеты, а не весь фильм (т.е. лучше при захвате делать нарезку сцен в отдельные файлы), причём ещё до включения видео в монтажную программу. Можно, впрочем, действовать следующим образом: монтировать с исходными файлами, а перед окончательной сборкой (render, export) заменить их на стабилизированные с теми же именами и параметрами, а исходные переложить в другую директорию. Для работы в пакетном режиме (Virtual Dub job control) на первом проходе удобно пользоваться командой Run video analysis pass (она не создаёт выходных файлов), только не забыть указывать отдельные log-файлы для каждого входного файла. Также, чтобы не вводить постоянно значения параметров, их можно сохранить, используя опцию VirtualDub Save/Load processing settings (это относится не только к параметрам Deshaker, а и ко всем остальным настройкам VirtualDub — кодеки, параметры звука и т.д. — короче, удобно иметь один или несколько сохранённых пресетов обработки).

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

Depan и MVTools — фильтры для AviSynth

Плагины, которые мы сейчас рассмотрим, относятся к программе обработки видео Avisynth. Если вы ещё с ним незнакомы, то очень рекомендую почитать вводную статью. Принцип работы Avisynth отличается от привычного — последовательность действий над видеофайлами записывается в виде скрипта (текстового файла с расширением .avs), который может быть загружен для просмотра или сохранения (кодирования) во многие программы, например, в тот же VirtualDub. Все настройки фильтров осуществляются заданием соответствующих параметров в строке скрипта, вызывающей данный фильтр. Результат можно посмотреть, открыв заново скрипт в VirtualDub (или другой программе). Это несколько непривычно на первый взгляд, но весьма удобно в плане хранения шаблонов применения фильтров.

И Depan, и MVTools — это не отдельные фильтры, а наборы из нескольких функций, предназначенных для решения многих задач, связанных с определением и компенсацией движения в кадре. При этом Depan работает с глобальным движением в кадре (как Deshaker в VirtualDub), а MVTools — с движением отдельных блоков (Motion Vectors), аналогично тому, как это делают MPEG-кодировщики. Есть функции для определения движения (DepanEstimate и MVAnalyse), которые выдают в качестве результата специальный поток данных, содержащий движение кадра как всего (для Depan) или вектора смещения отдельно для всех блоков кадра (MV). (Также есть функция MVDepan, которая по векторам смещения для блоков выдаёт параметры движения для всего кадра, т.е. переводит информацию из второго плагина в первый). Далее эти данные можно использовать в различных целях. Например, для собственно стабилизации движения (функция DepanStabilize). Или для компенсации движения, т.е. приведения текущего кадра к виду, максимально похожему на соседний (смещением и масштабированием его как целого для Depan или поблочным смещением для MVCompensate). Это используется как промежуточный этап в ряде сложных скриптов для временнОго шумоподавления или motion-compensated деинтерлейса. В пакет MVTools также входят функции для плавного изменения частоты кадров (временнОй интерполяции движения), размытия (motion blur) и т.д. Отметим, что рассматриваемые фильтры не работают напрямую с чересстрочным видео — для этого надо его сначала разложить на поля (SeparateFields), а после обработки — собрать обратно (Weave).

Последовательность работы с этими плагинами для достижения стабилизации такова: вызывается функция-«сервер», определяющая движение (DepanEstimate или связка MVAnalyse+MVDepan), её результат присваивается некоторому промежуточному клипу (который содержит не видеокадры, а служебную информацию для каждого кадра). Это соответствует первому проходу — анализатору движения в Deshaker. Далее в скрипте этот промежуточный клип используется вместе с исходным видеорядом для стабилизации (функция DepanStabilize). В силу архитектуры Avisynth, для вычисления конечного результата (кадров выходного потока) могут использоваться любые кадры исходного и промежуточных клипов в любом порядке, что и используется в DepanStabilize: он вычисляет оптимальную траекторию, запрашивая данные по движению для ряда предыдущих и последующих кадров, которые в этот момент анализируются предыдущей функцией (например, DepanEstimate). Таким образом, хотя формально вычисление выходных кадров происходит в один проход, внутренний механизм работы фильтра двухпроходный (точнее, с заглядыванием вперёд на фиксированное число кадров, не на весь клип). Благодаря кэшированию промежуточных кадров в Avisynth анализ движения выполняется однократно для каждого кадра, то есть мы не теряем в производительности.

Функция DepanEstimate производит оценку глобального движения методом фазовой корреляции (с помощью преобразования Фурье и определения наиболее подходящих величин сдвига, максимизирующих корреляцию данного кадра с предыдущим). Этот метод очень устойчив, нечувствителен к изменениям яркости, но определяет только смещение. Увеличение можно найти, коррелируя отдельно левую и правую части кадра и вычисляя разницу, хотя это менее надёжно. Поворот кадра не оценивается вовсе из-за ещё меньшей надёжности. Функция имеет ряд необязательных настроечных параметров и выдаёт псевдоклип с данными по движению, а также может выводить результат в log-файл, совместимый по формату с Deshaker'овским. Из важных параметров отметим trust — пороговое значение корреляции, ниже которого кадры признаются непохожими (смена сцены); zoommax — ограничение для оценки зума, если 1 (по умолчанию), то зум не оценивается; info — если true, то выходной клип будет содержать не служебную информацию, а исходный видеоряд с наложением вычисленных величин смещения и флага смены сцены (для отладки параметров, по умолчанию false).

Альтернативный способ оценки движения — вызов MVAnalyse для поблочного определения движения, а затем MVDepan для оценки глобального движения (с отбрасыванием блоков, сильно выбивающихся из общего направления, также как в Deshaker). MVAnalyse имеет очень много настроечных параметров, касающихся методов определения движения блоков и их согласованности для всего кадра. Есть и отладочная функция MVShow, позволяющая увидеть векторное поле движения блоков. Функция MVDepan конвертирует выходные данные MVAnalyse в формат, совместимый с Depan, то есть по движению блоков вычисляет глобальное движение для кадра. Она также имеет много настроек, управляющих отбрасыванием «неправильных» векторов (не согласующихся с общим движением), но, к сожалению, не может раскрашивать их разным цветом для отладки (но может выводить текстовую информацию о глобальном движении поверх клипа, а также записывать её в совместимый с Deshaker'ом log-файл). Параметры zoom и rot включают оценку зума и вращения вдобавок к смещению (в последнем случае необходимо правильно указать пропорции пикселя — pixaspect).

Полученные на первом этапе данные по анализу движения передаются в функцию DepanStabilize. (Вместо этого ей можно указать имя log-файла в формате Deshaker, что делает эти плагины совместимыми с ним по отдельности для первого и второго прохода). Для стабилизации движения камеры используется один из двух методов (начиная с версии 1.10): инерциальный (ранее — единственный) и усреднения. Оба используют в качестве параметра плавности cutoff частоту среза колебаний в герцах (см. самый первый график в статье), но отличаются в способе построения траектории: инерционный метод использует уравнение типа осциллятора с вынуждающей силой (исходными колебаниями камеры) и затуханием, что приводит действительно к запаздыванию реакции: если быстро водить камерой туда-сюда, то на выходе будут всё равно колебания, но с меньшей амплитудой и запаздывающие относительно входа. Этот метод использует информацию о движении только для предыдущих кадров. Метод усреднения выглядит более предпочтительным, т.к. использует информацию и о движении в будущем, но работает медленнее.

Для устранения пустых краёв доступны несколько опций: адаптивный зум (параметр addzoom=true, zoommax= предел увеличения) - работает, по-видимому, только для инерционного метода; mirror — заполнение краёв зеркально отражёнными пикселами (смотрится довольно курьёзно); prev и next — число предыдущих и последующих кадров, один из которых выбирается для заполнения (при этом кадр смещается, а при использовании MVDepan — также поворачивается, до совпадения с текущим кадром). В целом, наиболее приемлемые результаты получаются при комбинировании всех трёх методов, при условии, что вблизи границ не было чётких контуров (возможно также размытие отражённых областей — параметр blur). Использование адаптивного зума (время реакции задаётся параметром tzoom (сек)) весьма желательно, т.к. заполнение краёв далеко не идеально, но, к сожалению, в текущей версии недоступно для более совершенного метода стабилизации (усреднения).

Также для заполнения пустых краёв можно воспользоваться алгоритмом Exemplar-based inpainting (нечто вроде инструмента Clone stamp в Photoshop, т.е. заполнение текстурой из соседней области того же кадра), который реализован в фильтре ExInpaint. Выглядит довольно интересно."

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

Mercalli — фильтр для нескольких программ монтажа

Фильтр Mercalli от компании proDAD работает в нескольких наиболее популярных программах монтажа, включая Adobe Premiere Pro, Adobe Premiere Elements, Adobe AfterEffects, Avid Liquid, Canopus Edius, Sony Vegas и Pinnacle Studio. Фильтр доступен в демо-версии (функционально идентичен Expert, но выводит красный крест поверх видео), стандартной (ограничена SD разрешением и отсутствием некоторых настроек) и Expert. Также в паре к нему имеется фильтр VideoShaker, который, наоборот, добавляет дрожание (например, чтобы уравнять с видеорядом восприятие вставленной в фильм фотографии). Этот фильтр позиционируется разработчиками как «лёгкий в использовании», т.е. не требующий особых знаний теории, но при этом всё же предлагает определённое количество настроек. Кроме того, имеется около 30 пресетов, подбирающих оптимальные параметры под конкретный тип задач.

Фильтр также работает в два прохода. Сначала при его применении к клипу на timeline вызывается окно фильтра, в котором можно настроить его параметры.


Окно настроек Mercalli

Здесь мы сразу нажали кнопку Further settings, открывающую доступ ко всем настройкам. Как видно, почти все они даются в «условных величинах», но их физический смысл более-менее ясен. В середине находится блок настроек определения движения на первом проходе. Точность определения движения (Motion detection) может варьироваться от быстрой (more quickly) до точной (more valid) — нет причин не ставить её на максимум, просчёт всё равно идёт довольно быстро (хотя авторы утверждают, что среднее положение вполне достаточно в большинстве случаев). Important picture area управляет, на что больше ориентироваться при анализе движения — на центр кадра или его края, т.е., по большому счёту, на объект или фон. Настройки Special video analysis дают дополнительные возможности по учёту векторов движения: Detect shapeless content — в малоконтрастных областях (например, в облаках); Fast motions — с большими смещениями (обычно игнорируются), Micro motions — с очень малыми смещениями (тоже обычно игнорируются; включение сильно замедляет работу и может дать худший результат при большой зашумлённости картинки). Нижнее поле (Particular distinguishing characteristics) тоже управляет «вниманием» детектора движения: только силуэт (крупные детали) / контуры объекта / мелкие детали.

Справа находятся настройки стабилизации, т.е. второго прохода. Camera stabilization управляет степенью стабилизации — от лёгкой (Soft), устраняющей только сильную тряску, до Static, создающей эффект неподвижной камеры. Настройка Camera balance управляет «инерционностью» движения стабилизированной камеры; обычная установка in balance оптимальна для большинства случаев. Настройка Camera motion определяет, какие движения стабилизировать: только смещения (inclination), также повороты (tilt), также увеличение (zoom). Далее идут настройки компенсации краёв изображения. К сожалению, Mercalli не умеет заполнять их так, как Deshaker, так что остаются два варианта: или оставлять их чёрными, или заполнять пикселами с краёв картинки (галка Fill up border region). Кроме того, можно задать увеличение центральной части кадра для устранения бордюров (регулируется ползунком Scaling, либо включением режима Without borders(upscaled) для полного устранения бордюров). Адаптивным зумом фильтр, по-видимому, также не обладает, так что выбирается максимальная фиксированная часть кадра, не дающая пустых краёв. Вероятно, upscaled — единственная более-менее визуально приемлемая установка.
Кроме отдельных настроек, можно выбирать пресеты под конкретную задачу — съёмка с рук, с плеча, со штатива, с сильным дёрганием и т.д., а также пресет общего назначения (versatile).

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


Первый проход фильтра Mercalli

После этого можно перемещаться по timeline и наблюдать уже результат работы фильтра, что очень удобно. При необходимости можно пойти и отрегулировать значения параметров (если затрагивались параметры первого прохода, то он пересчитывается).

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

Прочие программы и фильтры для стабилизации

Кроме описанных здесь, существует ещё множество других программ и фильтров для стабилизации видео. Можно упомянуть Dynapel SteadyHand, 2d3 SteadyMove, фильтр Motion stabilize в пакете BorisRED, фильтр Track/Stabilize motion в Adobe AfterEffects. Первые два имеют минимум настроек, а в последних двух сходу тяжело разобраться, хотя профессионалы вовсю используют и Boris RED, и After Effects. Качество определения движения у них приемлемое, но из-за более простой — однопроходной — реализации возникают большие поля, которые можно убрать только зумом (заполнять края эти фильтры не умеют). В общем, некоторая область применимости у них есть, но универсальными их никак не назовёшь.

Сравнение работы стабилизаторов

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

Тестирование на нескольких сюжетах

Чтобы столкнуть нос к носу рассмотренные фильтры стабилизации, мы выбрали несколько сюжетов, подчёркивающих те или иные сложности процесса. Все отрывки имеют длину 200 кадров (8 секунд) и прогрессивный источник видео (чересстрочное обрабатывается более-менее так же).

Сюжет 1

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

Для Deshaker настройки первого прохода стандартные, ему вполне хватало, за что зацепиться взглядом (в более сложных случаях прежде всего выставляются на максимум Use pixels и Scale, затем уменьшается отбраковка малоконтрастных блоков). На втором проходе ставится Adaptive zoom only, 30 соседних кадров, параметры плавности побольше (10000).

Для Depan в функции DepanEstimate понижается порог trust (до 1.0), иначе некоторые малоконтрастные кадры считаются началом новой сцены (выясняется через режим info). На втором проходе добавляем соседние кадры (prev=next=20), отражение границ (mirror=15, blur=20), адаптивный зум (addzoom=true) и увеличиваем плавность (cutoff=0.2, чем меньше — тем плавнее). Результат похуже - остаётся заметное вращение. Если вместо DepanEstimate использовать MVAnalyse+MVDepan, то ситуация несколько лучше, но всё равно неидеальна.

В Mercalli включаем Detect shapeless content, Also detect details, ручку Camera stabilization в среднее положение, компенсацию поворотов (also tilt compensation), а края приходится убрать установкой Without borders(upscaled). В результате поле зрения меньше, а картинка более размытая.

Сюжет 2

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

Deshaker: настройки первого этапа стандартные, второго такие же, как раньше, добавили Soft borders (в прошлом сюжете это не потребовалось, даже если было бы включено), уменьшили плавность до 2000. В середине сюжета несколько кадров, когда фон почти отсутствует, и движение определяется по фигуре, а не по фону — в этом месте для остальных фильтров заметен некоторый рывок в скорости движения. Тщательно поработав с настройками первого этапа и совмещая log-файлы от разных настроек, можно добиться полной плавности, что и было сделано. Ещё в паре мест видна неидеальность компенсации краёв.

Depan: порог чувствительности снижаем до 2.0, используем DepanEstimate (вращение несущественно на фоне быстрых движений), частота среза — 1.0 по умолчанию.

Mercalli: смещаем ручку Importance area левее (к borders), Stabilization — к Soft (обе на пару делений от края); включаем Detect fast motions.

Сюжет 3

Третий сюжет — съёмка в движении с рук, спускаясь на лыжах. Движение камеры относительно пейзажа, и как следствие, неравномерное движение в кадре разноудалённых объектов.

Deshaker: на всякий случай на первом проходе отключаем анализ для нижней четверти кадра (Ignore area outside), всё равно там быстро движущаяся навстречу земля. На втором проходе плавность снижаем до 1000, а то драйв пропадает:)

Depan: болтанка камеры по всем направлениям, поэтому используем MVAnalyse для учёта вращения; остальные настройки такие же. Дёргания уменьшаются, но остаются заметно сильнее, чем после Deshaker — это «заслуга» DepanStabilize: если с log-файлом от MVdepan запустить deshaker, то движение будет намного плавнее.

В Mercalli выбираем пресет Improve helmetcam while racy drive (как раз для нашего случая), опять убираем бордюры (и зачем их там оставляют по умолчанию, раз замазывают всё равно скверно?). Плавность движений адекватная, но опять угол обзора меньше (впрочем, это не особо заметно).

В целом, можно сделать следующие выводы: Mercalli уверенно стабилизирует практически любую болтанку, но при этом приходится уменьшать размер кадра, что часто нежелательно. Depan хорошо работает в несложных случаях, при наличии вращения камеры лучше пользоваться анализом движения из MVTools; в сложных случаях стабилизация недостаточная; заполнение краёв смотрится не слишком хорошо. Deshaker хорошо работает практически во всех случаях, хотя иногда бывает полезна ручная настройка отдельных кадров; заполнение границ реализовано наиболее правильным способом, если оно всё же даёт артефакты — можно использовать дополнительный зум.

Сравнительные характеристики рассмотренных программ

Параметр Deshaker Depan+MVTools Mercalli
Объективные характеристики
Число проходов
2
2 [1]
2 [2]
Метод оценки движения
поблочный
Фурье/поблочный
поблочный?
Методы заполнения краёв
Fixed zoom, Adaptive zoom, граничные пикселы, соседние кадры
Adaptive zoom, отражение границ, соседние кадры
Fixed zoom, граничные пикселы
Поддержка Interlace
+
± [3]
+
Поддержка многопоточности
+
± [4]
+
Бесплатен
+
+
Субъективные оценки
Удобство работы
4
4 -
5
Скорость работы
3
5
5
Богатство настроек
5
5
4
Качество определения движения
5
4 / 5 [5]
5
Качество стабилизации
5
4
5
Качество обработки краёв кадра
5
4 -
3 [6]
  • [1] первый проход выполняется параллельно со вторым
  • [2] первый проход выполняется при закрытии окна настроек
  • [3] для работы с чересстрочным видео требуются соответствующие «обкладки» в скрипте
  • [4] есть модификации скрипта для использования с многопоточной версией Avisynth
  • [5] Depan определяет только сдвиг, MVTools — также поворот кадра
  • [6] выглядит хорошо только при использовании дополнительного зума

Итак, выводы — кратко: Mercalli — удобен в работе, быстр, хорошо справляется со стабилизацией, но приходится растягивать центр кадра на весь экран, чтобы избежать краёв. Плагины для Avisynth стоит изучить, если душа лежит к этому замечательному средству обработки видео, и применять по мере необходимости (не только для стабилизации); в несложных случаях хорошо справляются с задачей стабилизации. Deshaker — универсальный инструмент, качественно (хотя и довольно медленно) работает почти в любой ситуации, его стоит освоить в любом случае (надеюсь, данная статья поможет в этом; см. также более старое руководство).

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

 

Автор выражает благодарность Александру Балахнину aka Fizick
при участии Сергея Гавриша aka Turyst04

 

 




Дополнительно

iXBT BRAND 2016

«iXBT Brand 2016» — Выбор читателей в номинации «Процессоры (CPU)»:
Подробнее с условиями участия в розыгрыше можно ознакомиться здесь. Текущие результаты опроса доступны тут.

Нашли ошибку на сайте? Выделите текст и нажмите Shift+Enter

Код для блога бета

Выделите HTML-код в поле, скопируйте его в буфер и вставьте в свой блог.