Уже более пяти лет, как на камерах GoPro появилась функция цифровой стабилизации изображения «на борту». А видео с новейших action-камер, с технологией Hypersmooth - выглядит поистине впечатляюще. Полное ощущение полёта. После такого качественного изображения, просмотр видео со своей архаичной GoPro2 уже не вызывает никаких эмоций.
Лучшее решение – купить новую Гоупроху, и не делать себе мозги. Но это – цена хорошего шлема, и не только лишь все могут себе позволить. Но мы попробуем выжать максимум из старой action-камеры без встроенной стабилизации, и осуществить данную функцию методом пост-обработки. Пример такой стабилизации вы могли раньше наблюдать на Youtube (в разделе «улучшить»), однако потом этот функционал почему-то убрали. Однако, там стабилизация осуществлялась в автоматическом режиме, и результат был не всегда предсказуем. Мы же будем выполнять стабилизацию локально, с параметрами, которые нам подходят лучше всего. Результат будет не такой потрясный, как хотелось бы, но видео точно будет более смотрибельнее.
Полный список необходимого ПО.
- K-Lite Codec Pack (Mega). Для экспорта финального видео в удобоваримый формат. Если у вас уже стоят кодеки, то можно пропустить, или установить позже. Ссылка на оффсайт: https://www.codecguide.com
- VirtualDub. С помощью этой утилиты и будем редактировать видео. Ссылка на оффсайт: http://www.virtualdub.org/
- Deshaker. Плагин стабилизации для VirtualDub. Ссылка на оффсайт: http://www.guthspot.se/video/deshaker.htm
- FFInputDriver_64. Нужен для импорта видеофайла GoPro формата MP4. Ссылка на оффсайт: https://sourceforge.net/projects/virtualdubffmpeginputplugin...
- QuickTime64 Нужен для импорта видеофайла GoPro формата MP4. Ссылка на оффсайт: https://sourceforge.net/projects/fcchandler/files/Virtualdub Quicktime Plugin/
Установка.
1. Скачиваем и распаковываем VirtualDub.
2. Скачиваем и распаковываем Deshaker31_64.ziр. Файл Deshaker_64.vdf копируем в VirtualDub-…\plugins64
3. Скачиваем и распаковываем VirtualdubFFMpegPlugin_1905_X86_X64.ziр. Файл FFInputDriver_64.vdplugin и папку ffdlls копируем в VirtualDub-…\plugins64
4. Скачиваем и распаковываем QuickTime64. Файл QuickTime64.vdplugin копируем в VirtualDub-…\plugins64
В итоге папка VirtualDub-…\plugins64 должна выглядеть вот так:
Обработка.
1. Запускаем Veedub64.exe.
2. Открываем необходимый видеофайл - меню File > Open video file – в окне предварительного просмотра появляется картинка.
3. Из контекстного меню можно сделать размер картинки 33% - так будет видно второе окно предпросмотра. Второму окну предпросмотра можно также задать удобный размер (например, 66%).
4. Я сразу отключаю аудиодорожку - меню Audio > No audio, т.к. там только шум дороги.
5. Длинное видео с лишними кадрами лучше сразу обрезать для ускорения процесса анализа – для этого нужно выделить участок видео, который нужно оставить, и выполнить в меню Edit > Crop to selection. Выделить участок таймлайна можно хоткеем ‘Home’ и ‘End’, либо на тулбаре – крайними правыми кнопками.
6. Включаем Deshaker – меню Video > Filters… Add Filter – Deshaker v3.1 > OK
Фильтр Deshaker работает в два прохода – в первый проход производится анализ данных, а во второй проход – непосредственная обработка.
7. Настраиваем общие параметры.
• Source pixels aspect – интернет подсказывает, что подавляющее количество цифровых систем имеет квадратный пиксель, так что оставляем ‘1:1’.
• Video type – аналогично, для цифровых устройств оставляем ‘Progressive scan’
• Rolling shutter – в мануале (http://www.guthspot.se/video/deshaker.htm) есть примеры устройств, и соответствующий параметр для компенсации искажения. Если нет в мануале – гуглите. Не нашли - забейте. На глаз я разницы не заметил.
• Log file – указываем, куда будет сохраняться log-файл. Именно по нему будет происходить дальнейшая обработка видео. Лайфхак – для экспериментов с настройками второго прохода не обязательно каждый раз проходить Pass1 – достаточно, чтобы в папке лежал нужный файл лога.
8. Настраиваем первый проход - Pass 1 (кнопка первого прохода уже активна по-дефолту).
Первый проход – самый важный. Именно по результатам анализа картинки плагин распознаёт «хорошие» векторы движения от «плохих». Хорошие векторы (белые) – должны располагаться на фоне, на дальнем плане. Рельеф, деревья, горизонт, тучи – это оно. Плохие векторы (красные) – это то, что алгоритм игнорирует и не использует для стабилизации. Движение и объекты переднего плана - должны быть красными. Если будут ошибки в распознавании векторов, то второй проход не сможет стабилизировать видео, даже если мы выкрутим плавность в Max.
Поначалу я не придавал достаточного внимания первому проходу и оставлял настройки дефолтными, но и результатом был не очень доволен. Надо понимать, что съемка в движении, когда движется сама камера относительно фона – сложнейший кейс для алгоритмов стабилизации. И если дефолтные настройки первого прохода вполне подойдут для стабилизации видео «с рук» со статичным фоном (панорама), то в нашем случае этого будет недостаточно. Поэтому, наша задача – подобрать подходящие настройки, и визуально проконтролировать процесс анализа векторов движения (это очень важно).
Для своего видео я остановился на следующих настройках:
• Video output: Motion vectors, extended 5x.
Включаем отображение более длинных векторов для визуального контроля корректности анализа (это важно!).
• Scale: Full.
Чем больше, тем лучше (но медленнее).
• Use pixels: All.
Чем больше, тем лучше (но медленнее).
• Detect Zoom: OFF.
У нас action-камера без зума, нам это лишнее.
• Deep analysis if < 50 % of vectors are ok.
Включает глубокий анализ, если белых векторов менее 50%. Может сильно замедлить работу. Не работает с rolling shutter.
• Skip frame if < 4 % of all blocks are ok.
Рекомендуют снизить этот параметр для сложных условий при съемке в движении.
• Ignore pixels: ☑ Inside: 0, 1000, 0, 0.
При первой попытке прохода с дефолтными значениями я увидел (мы помним - это важно), что много белых точек располагается на моем шлеме, который занимает добрую часть экрана. Это грубая ошибка – на шлеме не должно быть «хороших» точек вообще, т.к. он трясется вместе с камерой (кэп). Поэтому этой настройкой мы отключаем анализ пикселей в этой части экрана.
• Нажимаем [ ОК ] в окне Filter: Deshaker, нажимаем [ ОК ] в окне Filters.
9. Для создания лога первого прохода нам необходимо воспроизвести видео полностью. Нажимаем [ F5 ] на клавиатуре – запускается превью с векторами. На экране также видим прямоугольник игнора пикселей.
Наша задача во время превью - визуально проконтролировать процесс анализа на корректность определения хороших и плохих векторов, о чем я писал чуть выше.
Если всё ОК, то дожидаемся окончания превью и переходим ко второму проходу.
10. Еще раз идем в меню Video > Filters… и даблкликом открываем Deshaker v3.1 (Pass 1)
11. Нажимаем кнопку [ Pass 2 ] и настраиваем второй проход.
Большинство настроек мы оставляем без изменений, но я хотел бы провести небольшой ликбез по параметру Edge Compensation. Как мы понимаем, стабилизация видео невозможна без перемещения границ видео. И данный плагин позволяет компенсировать эти искажения несколькими способами.
Самый простой вариант – это режим Fixed zoom (no borders). Плагин фиксированно зуммирует видео настолько, чтобы скрылись границы самой сильной компенсации. На практике, при нашем кейсе (когда есть сильные повороты головы) - видимое поле сужается просто катастрофически, и этот режим неприменим.
Остальные варианты зуммирования так или иначе основаны на адаптивном зуме, когда видимое поле подстраивается под интенсивность смещений. Один из таких вариантов был реализован когда-то в YouTube. Подробные описания каждого режима я приводить не буду, можете почитать в мануале. Мне эти режимы не нравятся как раз по причине плавающего зума.
Я остановился на дефолтном варианте None (large borders) – в этом случае никакой автоматический зум не применяется, и плагин (изначально) рисует черные границы по периметру экрана. Но с этим мы поборемся двумя способами – мы добавим небольшой фиксированный зум, который скроет 95% границ, а также включим достраивание изображения за границами по типу нейросети, на основе предыдущих кадров. Это позволит не бросаться в глаза тому небольшому количеству сильных искажений, что «прорвется» через фиксированный зум.
Таким образом, мы изменяем только параметры:
• Use previous and future frames to fill in borders: ☑
Включаем достраивание изображения за границами по типу нейросети на основе предыдущих кадров.
• ☑ Soft borders. Edge transition width: 30 pixels
Увеличиваем «мягкие границы» до 30 пикселей.
• Extrapolate colors into borders: ☑
Включаем замену пикселя черной границы, который заменяется цветом, экстраполированным от края известных пикселей.
• Extra zoom factor: 1.1
Добавляем небольшой постоянный зум.
По поводу параметров Motion smoothness. Эти параметры как раз определяют наш «эффект дрона». В нашем сценарии, когда возможно быстрые повороты головы на большой угол, нет никакого практического смысла ставить значения больше дефолтных. Будут вылезать границы, и плагин будет пытаться сгладить повороты головы, а не только тряску, что выглядит весьма странно. Также при больших амплитудах стабилизации будут проявляться перспективные искажения, так что не стоит сильно заигрываться с этими параметрами. Позже я покажу на примере, что будет, если выкрутить плавность на Max.
С параметрами Max. correction limits ситуация аналогичная. Эти параметры определяют максимальные диапазоны сдвига картинки, и таким образом ограничивают Motion smoothness. Дефолтные значения уже достаточно большие, и нет никакой необходимости их делать больше.
Для визуального понимания прилагаю картинку (справедлива для данных настроек):
Белая линия – это фиксированный зум. Картинка изначально обрезается по эту границу.
Красная линия – это максимальные границы коррекции. Границы изображения не могут перемещаться за эту линию в любом случае.
Желтая косая линия – максимальный поворот при коррекции. Изображение не может повернуться на больший угол в любом случае.
Между белой и красной/желтой линией – наши потенциальные рамки из достроенного изображения. Логика ясна – чтобы их убрать или уменьшить, нужно либо увеличивать фиксированный зум, либо уменьшать лимиты коррекции. Также не забывая, больше плавность – больше рамок.
• Нажимаем [ ОК ] в окне Filter: Deshaker, нажимаем [ ОК ] в окне Filters.
12. Открывается небольшое окно Deshaking… с прогресс-баром. Дожидаемся окончания процесса.
13. Выбираем кодек для экспорта видео. Меню Video > Compression…
Мой выбор: x264vfw – H.264/MPEG-4 AVC codec.
Выделяем, нажимаем [ Configure ] > отмечаем галку ☑ VirtialDub Hack > OK > OK
14. Экспорт видео. Меню File > Save as AVI… Выбираем имя файла > [ Сохранить ]
15. Дожидаемся завершения процесса кодирования и сохранения. Наслаждаемся новым видеофайлом.
Результат.
Предлагаю вам посмотреть наглядное сравнение. Правое видео стабилизировано по настройкам, которые мы указали выше.
А теперь ради эксперимента попробуем достичь эффекта "полёта дрона" и выкрутим Motion smoothness на 100 000, а неизбежное увеличение границ немного компенсируем увеличением Extra zoom factor до 1.2
Безусловно, «эффект полёта» более явный. Но на 35 секунде видны артефакты при попытке полностью сгладить поворот головы. Впрочем, если не акцентировать на них внимание, то они не бросаются в глаза. Возможно, такой экстремальный режим сглаживания прокатил бы на жестко зафиксированной камере, например, на автомобильном видеорегистраторе.
Все оригиналы видеофайлов можно посмотреть/скачать здесь: https://drive.google.com/drive/folders/1xUjbPIKqa2MLFSqRceRc...
Еще комментарии.
Результат успешного анализа видео на векторы движения почти полностью зависит от фона изображения. На фоне с контрастными объектами - лес, горы, белые облака на синем небе – первый проход обречен на успех.
Если же вы едете в голой степи, где половина экрана занимает чистое небо - алгоритму просто не за что зацепиться, и результат стабилизации будет не удовлетворительный.
Качество прохода еще более ухудшается, если камера сильно задрана наверх. Поэтому в любом случае я рекомендую настраивать положение камеры так, чтобы выше горизонта оставалось от 1/3 до 1/4 части картинки. Так и POV видео лучше воспринимается, и качество анализа первого прохода выше.
Для стабилизированного видео лучше, чтобы шлем не попадал в поле зрения камеры. Иначе он будет ожидаемо «трястись» после стабилизации изображения. Аналогично – с царапинами, пятнами и мусором на объективе камеры. Пятна будут прыгать по экрану, протирайте объектив почаще.
Вывод.
При благоприятных условиях съемки стабилизация методом пост-обработки с помощью плагина Deshaker v3.1 даёт достаточно хороший результат. Обрабатывать все исходники подряд я не вижу никакого смысла – не хватит ресурсов.
А вот обработать уже смонтированный видеофильм не займёт слишком много времени и сил, и этим уже есть смысл заниматься.
Надеюсь, был полезен. С уважением…