Очень часто на форумах можно видеть вопрос: "Расскажите как и чем стабилизировать видео? Какие настройки использовать?" В свое время, когда передо мной встали эти вопросы, очень помогла одна статья Евгения Васильева и Сергея Гавриша. Надеюсь, что кому-то еще эта информация будет полезной. Под катом делаю перепост. Планирую разбить на несколько частей, т.к. целиком в заметку ЖЖ не влезает.
Введение
Данная статья посвящена исследованию вопроса о программной стабилизации видео. Не секрет, что одно из основных отличий профессиональной съёмки (в частности, кино) от любительской заключается в том, что профессионалы, как правило, снимают со штативами, кранами, тележками и прочими приспособлениями, обеспечивающими неподвижность или плавное движение камеры, тогда как любители обычно об этом не задумываются. Как следствие, часто в любительской съёмке происходит такое мельтешение в кадре, что после нескольких минут просмотра начинает болеть голова, или во всяком случае пропадает желание смотреть на экран. Рецепт профессионалов, конечно, годится и для нас, простых видеолюбителей - надо учиться снимать со штативом. Однако не всегда он есть под руками, да и некоторые сюжеты нельзя толком снять с использованием штатива (а кран и тележка уже, увы, для любителей практически недоступны). Что же делать с таким видеорядом? Существуют достаточно мощные возможности по стабилизации изображения уже на этапе компьютерной обработки, и о них пойдёт речь в этой статье (во второй её части). Но сначала некоторое теоретическое введение.
Теоретическая часть
Для начала определим фундаментальный механизм работы любой системы стабилизации. Он имеет как минимум две составляющие: определитель «дрожания» и собственно механизм восстановления кадра без дрожания. При этом под дрожанием обычно подразумевается нежелательное беспорядочное движение самой камеры. А точнее, вращение камеры относительно любой из трёх осей, проходящих через её центр. Вращение относительно главной оптической оси (той, которую протирают спиртом:) приводит к вращению кадра (впрочем, это редко заметно), остальные две оси дают смещение по горизонтали и вертикали. Нужно иметь в виду, что помимо движения кадра как целого (движения фона), обусловленного в том числе и дрожанием камеры, часто ещё движется и объект в кадре относительно фона. Это создаёт одну из главных проблем при стабилизации в сколько-нибудь сложных случаях.
Стабилизаторы в видеокамерах
Перед тем, как перейти к разговору о программных стабилизаторах, вспомним, как осуществляется стабилизация при съёмке. Об одном, самом надёжном методе - механическом - я уже упомянул; помимо него, есть ещё два: оптический и цифровой стабилизатор. Их механизм работы отличается в обоих составляющих.
Оптический стабилизатор состоит из детектора движения (вращения) камеры - системы гироскопов, регистирующих ускорение, и компенсирующей линзы, которая может смещаться перпендикулярно оптической оси и отклонять лучи света в противофазе к обнаруженному смещению, так что они попадают в одну и ту же область на матрице. Снятие показаний с датчиков ускорения и соответственно смещение линзы происходит несколько сот раз в секунду, т.е. много раз за время экспонирования кадра, что позволяет избежать не только нежелательного сдвига картинки между кадрами, но и размытия её в пределах одного кадра (при сильном рывке). Кстати, аналогичную функцию выполняют оптические стабилизаторы в фотоаппаратах, где нет проблемы «межкадрового сдвига».
Цифровой стабилизатор определяет смещение по анализу изображения, получаемого с матрицы. Для этого, разумеется, её реальный размер должен быть существенно больше эффективного, чтобы при небольших смещениях кадр не вылетал за пределы матрицы. Записывается же на носитель изображение с меньшей по размеру области, которая «прыгает» по матрице от кадра к кадру согласно определённому вектору смещения. Недостатки у этого метода по сравнению с оптической стабилизацией очевидны: во-первых, используется не вся площадь матрицы, что приводит к ухудшению соотношения сигнал/шум при недостаточной освещённости, во-вторых, нет возможности устранить внутрикадровое размытие (которое, впрочем, досаждает только при длинных выдержках и достаточно сильной трясучке). Кроме того, стабилизатор не может предугадать, является ли смещение случайным дрожанием либо началом целенаправленного движения камеры (например, панорамы). Это иногда приводит к эффекту «залипания», когда при начале панорамирования кадр некоторое время удерживается на месте стабилизатором, а при достижении предела (края матрицы) может резко прыгнуть. В оптической системе стабилизации такого эффекта почему-то не наблюдается, хотя возможности предсказать движение камеры нет и там.
Эффект от стабилизатора в камере очень велик, особенно при длиннофокусной съёмке (большом «зуме»). Однако стабилизатор гасит только высокочастотные колебания не слишком большой (в силу конструктивных ограничений) амплитуды. Чтобы оценить эффект от накамерной стабилизации, взгляните на следующий график:
На нём представлены частотные спектры смещений камеры, определённые с помощью анализа движения в фильтре 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 (для работы последних версий может дополнительно потребоваться загрузить
библиотеки VC++ 2005 (около 2 мб). Итак, будем предполагать, что вы уже знакомы с VirtualDub (если нет, читайте
статью про него). Загружаете исходный клип в программу и в диалоге фильтров добавляете Deshaker. Открывается окно с большим количеством настроек, которые мы сейчас разберём подробно.
Как легко видеть, настройки собраны в три группы: общие для обоих проходов и отдельно для первого и второго (переключается кнопками Pass 1 и Pass 2 вверху). Из общих надо выставить Source pixel aspect - параметр «неквадратности пиксела»: для видео 4:3 с miniDV или другой камеры стандартного разрешения это будет Standard PAL, для широкоэкранного с такой же камеры - Anamorphic PAL, для видео с фотоаппарата, как правило, оставить вариант по умолчанию Square pixels. Не менее важно задать тип чересстрочного сигнала - для большинства камер это Interlaced, lower field first, для фотоаппарата и прогрессивного режима (или frame mode) в видеокамерах - Progressive scan. Дальше имеет смысл задать имя и местоположение будущего log-файла (вряд ли захочется хранить его в корневом каталоге диска C, да и имя лучше задать соответствующим имени видеофайла).
Настройки первого прохода
Настройки первого этапа в основном призваны улучшить качество определения движения на первом проходе. Мы рассмотрим их чуть позже, а пока обратим внимание на верхнее поле: 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
Настройки второго прохода
Первый этап закончился - переходим ко второму (нажав соответственно кнопку Pass 2 в диалоге фильтра). Здесь можно настроить размер выходного изображения (обычно он равен входному, что и задано по умолчанию), метод масштабирования (bicubic по умолчанию - не надо менять), режим работы с границами.
Пункт Edge compensation управляет режимом использования дополнительного зума: No zoom (large borders) отключает эту функцию, Adaptive zoom использует плавно меняющийся (адаптивный) зум, Fixed zoom выбирает наиболее подходящее постоянное значение зума. В режиме адаптивного зума для каждого кадра выбирается необходимое значение увеличения (с учётом уже стабилизированного движения и поворота), а далее возможны два варианта: в режиме adaptive zoom only полученные значения зума сглаживаются с учётом параметра motion smoothness (zoom), чтобы не было иллюзии резких наездов-отъездов камеры. В режиме по умолчанию Adaptive zoom (small borders) сглаживанию подвергается произведение величины зума, определённого по движению кадра, и этой дополнительной величины адаптивного зума. Разница здесь в следующем: если в сюжете не было собственно зуммирования камеры или вы не хотите его сглаживать, то стоит выбирать Adaptive zoom only. В противоположном случае оставляйте значение по умолчанию. (Надо отметить, что управление зумом на камере по конструкции не допускает резких рывков, поэтому нужды стабилизировать зум может и не возникнуть. С другой стороны, Deshaker мог ошибиться при анализе движения на первом проходе и неверно рассчитать зум, тогда при попытке его стабилизации возникнет искусственный скачок увеличения, и тогда надо либо переделывать первый проход, либо установить Adaptive zoom only. С другой стороны, если нет противопоказаний, то можно использовать стабилизацию суммарного зума, что и включено по умолчанию).
Так вот, после стабилизации кадра возникают незаполненные края, частично (но не всегда полностью) убираемые зумом. 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), большее значение соответствует большей плавности. Величины по умолчанию (400 для смещения и 1500 для зума) довольно малы, для большинства сюжетов их можно увеличить в 10-30 раз (зависимость «плавности» от них, видимо, довольно пологая). При выборе значений можно руководствоваться следующим эмпирическим правилом: чем больше плавность движения в исходном видео, тем большие значения можно безболезненно задавать. Т.е. для панорам вполне сгодятся значения 10000, а для съёмок стремительного спуска с горы, держа камеру в руках, такая плавность приведёт, во-первых, к неоправданно большим областям по краям кадра, требующим заполнения (что чревато артефактами в случае такого сложного движения), и во-вторых, уменьшит зрелищность сюжета:). Для таких динамичных съёмок подойдут величины порядка 1000. Если вы видите, что при заданных значениях остаются слишком много областей по краям, требующим заполнения, то плавность стоит уменьшить (или включить дополнительный зум). Впрочем, есть ещё средство для урегулирования быстрых рывков: группа параметров Max correction limits, задающая пределы смещения/поворота при вычислении оптимальной траектории. Их действие состоит в том, что при резких рывках, когда невозможно обеспечить одновременно и плавность траектории, и невыход за пределы смещения, параметры плавности на короткое время уменьшаются по сравнению с заданными. Ещё нужно отметить, что траектория рассчитывается по кадрам, а не по времени (для интерлейсного видео - по полукадрам). Т.е. для получения той же плавности в случае интерлейсного видео нужно установить вдвое большие значения, чем для прогрессивного с той же частотой кадров.
Итак, параметры второго прохода настроены, можно запускать. Устанавливаем кодек для видео и в путь. Перед началом второго этапа происходит вычисление оптимальной траектории камеры для всего клипа, что может занять продолжительное время (особенно при больших параметрах плавности), но обычно сам второй проход длится намного дольше. В это время на экран выводится табличка «Deshaking».
Когда вычисления готовы, можно начинать второй проход.
Но есть одна тонкость, которую нужно учитывать при использовании для заполнения границ ненулевого числа будущих кадров. Дело в том, что интерфейс взаимодействия VirtualDub с плагинами не даёт возможности произвольного доступа к входному потоку - можно получить только текущий кадр (при последовательной обработке - запомнить и любое количество предыдущих). Поэтому Deshaker использует следующий трюк: если задано ненулевое число будущих кадров F, то вывод фильтра задерживается на F кадров для аккумуляции их во внутреннем буфере. Вместо них выдаётся чёрный экран с сообщением, суть которого сводится к тому, что надо установить соответствующую задержку для звука, чтобы не возникло рассинхронизации (величина задержки в мс указана на экране).
Это делается в VirtualDub в меню Audio / Interleaving / Delay audio track by ... ms. Впрочем, часто можно этого и не делать, если звук не важен и будет заменён при монтаже (шум), или просто не привязан к изображаемым объектам. Чтобы в полученном клипе не было лишних пустых кадров в начале, нужно задать диапазон обработки с F-го кадра и перед сохранением вручную прокрутить первые F кадров. Т.е., например, вы переходите на начало клипа, нажимаете стрелку вправо нужное число раз, на F-м кадре от начала появляется изображение, вы нажимаете Home (задав тем самым начало обработки с текущего кадра) и непосредственно за этим нажимаете File / Save as AVI. Опять-таки, можно этим не заниматься, если при монтаже всё равно можно подрезать клип нужным образом.
Более неприятно, что таким образом в полученном файле будут отсутствовать последние F кадров. Чтобы этого избежать, надо перед сохранением добавить (Append avi segment) любой файл с точно тем же форматом видео и звука (они не будут использоваться) и числом кадров не меньшим F. Можно использовать сам исходный клип (тогда нужно запомнить его длину и перед сохранением выставить диапазон обработки (Video / Select range): начало с кадра номер F и длина, равная исходной). Либо, если вы обрабатываете много файлов с одним и тем же значением F (как правило, менять его не требуется), то можно заранее отрезать кусок длины F от любого из исходных файлов и добавлять его ко всем (тогда не нужно будет запоминать и выставлять длину каждого клипа, поскольку обработка будет вестись с F-го кадра и до конца).
При прокрутке внутри клипа действуют те же ограничения - чтобы посмотреть с какого-то момента, надо сначала прокрутить вручную F кадров подряд. В целом, это неудобство, обусловленное непредусмотрительно спроектированной архитектурой VirtualDub, немножко досаждает, но при должном автоматизме отнимает всего десяток секунд на клип. Можно, конечно, и вовсе не использовать будущие кадры - тогда проблемы нет, но в большинстве случаем лучше всё же их включить и действовать по описанному рецепту.
Резюме по применению
Итак, суммируя изложенное, последовательность действий для работы с Deshaker такова:
- Открываем исходный файл в VirtualDub, добавляем фильтр Deshaker, настраиваем общие параметры - Source pixel aspect, Video type, при желании - Log file; настройки первого этапа можно не трогать.
- Запускаем первый проход нажатием F5, откидываемся на спинку стула, пьём чай, при желании - наблюдаем за векторами смещения.
- Заходим в настройки фильтра, выбираем второй проход, ставим подходящие значения плавности (Motion smoothness), например, по 5000; включаем галку Use previous and future frames (если неохота возиться с будущими кадрами, выставляем их число в 0); желательно также включить Soft borders (хотя это сильно замедляет работу).
- Если используются будущие кадры, то действуем согласно описанному рецепту, иначе просто сохраняем клип (не забыв выбрать кодек для видео). Смотрим его в плеере, проверяем адекватность результата; при необходимости меняем настройки второго прохода и сохраняем; если заметны дёргания или другие признаки неправильного определения движения, то придётся подкорректировать первый проход.
В следующей части будут рассмотрены сложные случаи стабилизации, а также сделано сравнение работы разных фильтров...