GenMotion - Генерация движения для глобальной компенсации
С-плагин для Avisynth 2.5
Версия 0.7 от 8 апреля 2004 г.
Copyright (C)2003-2004 Александр Г. Балахнин aka Fizick.
http://bag.hotmail.ru
Этот плагин (фильтр) генерирует общее движение для его глобальной компенсации,
используя готовые данные по оценке движения.
В качестве таких данных, плагин использует лог файл плагина Deshaker для VirtualDub (от Gunnar Thalin).
Плагин может быть использован для::
- простой частичной стабилизации движения (не такой хорошей как Deshaker);
- компенсации движения для сильной временной фильтрации и реставрации клипов (кинофильмов),
— восстановления отдельных испорченных кадров путем интерполяции,
— создания серии промежуточных кадров для изменения частоты кадров клипа.
Процесс видеообработки:
1. Подготовка данных по оценке общего движения:
В VirtualDub, выполните только первый проход плагина Deshaker, и запомните имя файла лога Deshaker.
Предварительно Вы должны настроить параметры Deshaker согласно его документации.
В течение первого прохода, Deshaker пытается найти величины перемещений, поворота и зума, которые,
приложенные к текущему кадру, делают его похожим на предыдущий.
2. Компенсация движения:
Используйте плагин GenMotion в Avisynth скрипте (командном файле) примерно так:
Genmotion(clip,filename="e:\deshaker.log", delta=1,tff=true, subpixel=1,pixaspect=1.0)
Параметры плагина:
filename - имя файла лога Deshaker,
delta - используемый временной шаг (в единицах кадра), от -1.0 до 1.0, в частности:
delta= -1.0 есть полная компенсация движения назад, (последний кадр неизменен)
delta=1.0 есть полная компенсация движения вперед, (нулевой кадр неизменен)
delta=-0.5 есть простая обратная частичная стабилизация, (последний кадр неизменен)
delta=0.5 есть простая прямая частичная стабилизация, (нулевой кадр неизменен)
delta=0 есть отсутствие изменений.
tff - порядок полей для чересстрочного видео (true или false, default = как Avisynth полагает):
задайте true - для top field first (большинство аналогового видео),
задайте false - для bottom field first (DV источник)
subpixel - режим субпиксельно точности и интерполяции (0 или 1, default=1):
0 - с точностью до пиксела (по ближайшему пикселу),без интерполяции (быстро),
1 - субпиксельная точность с билинейной интерполяцией (лучший для шумного видео),
2 - субпиксельная точность с бикубической интерполяцией (лучший для чистого видео).
pixaspect - аспект (неквадратность) пиксела (1.0 для 768x576, default=1.0),
grey - преобразование в оттенки серого (true или false, default=false):
задайте true для преобразования в серый тон с более быстрой обработкой,
задайте false для сохранения цветов.
dxmax - максимальное значение горизонтального смещения в данных по движению, (default = 100),
dymax - максимальное значение вертикального смещения в данных по движению, (default = 50),
rotmax - максимальное значение угла поворота в данных по движению, (default = 5),
zoommax - максимальное значение зума в данных по движению, (default = 1.2),
(если значение максимального параметра положительно, величина ограничивается данным значением,
если отрицательно, то сбрасывается в нулевое изменение )
Использование плагина для простой частичной стабилизации движения (уменьшения тряски)
Используйте GenMotion плагин в Avisynth скрипте примерно так:
Genmotion(clip,filename="e:\deshaker.log", delta=0.5)
Вы получите результат с уполовиненной тряской.
Использование плагина для подготовки клипов с компенсацией движения для последующей временной фильтрации.
1. Загрузите входной клип (I),
2. Сделайте клип (F) с прямой компенсацией движения,
3. Сделайте клип (B) с обратной компенсацией движения,
4. Сделайте клип чередования, с компенсированными кадрами перед и после каждого оригинального кадра;
Вы получите длинный клип (с утроенной длиной), с каждыми тремя последовательными кадрами,
соответствующими одному времени.
5. Примените некоторый временной фильтр, который использует разницу пикселов между предыдущим. текущим и последующим кадром, например условный временной медианный фильтр.
6. Выберите каждый третий кадр результата (оригинальный не компенсированный, но фильтрованный).
Полученный отфильтрованный клип не будет иметь много артефактов, производимых общим движением
при временной фильтрации (тряска камеры, панорама, зум будут учтены).
Необходимые программы
1. Данная программа является плагином (фильтром) для Avisynth 2.5 (http://www.avisynth.org)
Тестировался с версиями 2.52 и 2.53.
Версия 2.54 тоже может быть использована.
2. Плагин нуждается в Avisynth C интерфейсе (avithynth_c.dll) от Kevin Atkinson.
Copyright (C) 2003 Kevin Atkinson )
Тестировался с версией 0.14 и 0.15, использующих CDECL вызовы.
Замечания.
- Новый Avisynth v.2.53 имеет встроенную поддержкуl Avisynth_С плагинов,
не требуется внешний avisynth.dll для их загрузки.
- Последняя экспериментальная версия Avisynth C Interface v.0.20 использует STDCALL вызовы,
имеет некоторые проблемы и НЕ совместима с текущей версией GenMotion.
- Avisynth v.2.54 имеет внутреннюю поддержку Avisynth_C Interface v.0.20,
с декларированной поддержкой как CDECL так и STDCALL вызовов, но имеет с этим проблемы.
Внутренняя поддежка Avisynth C удалена в Avisynth v.2.55 alpha.
- Внешняя avisynth.dll работает нормально со всеми версиями.
- Мы надеемся на разрешение данных проблем.
3. Видеоредактор Virtual Dub by Avery Lee (http://www.virtualdub.org)
Тестировался с версией 1.4.13.
Также с версией 1.4.13 VirtuaDubMod.
4. Deshaker Plugin (for VirtualDub) by Gunnar Thalin
Тестировался с версией 1.4
5. Программа компилировалась с помощью GCC 3.3.1, MinGW, MSYS (все не требуются для использования Genmotion.dll)
Некоторые (тестированные) подходящие временные фильтры
CTMedian (Conditional Temporal Median) by Kevin Atkinson (и немного от меня).
STMedianFilter by Tom Barry - [email protected]
FluxSmooth by Ross Thomas <>
RemoveDirt by Rainer Wittmann [email protected]
И еще...?
Прошу, делайте тесты чтобы добавить фильтры в список!
Для предложенного метода фильтрации с GenMotion,
такой временной фильтр должен сравнивать пиксел с предыдущим и последующим кадром,
и делать сглаживание только если разница между предыдущим и последующим мала.
Эти фильтры также могут выполнять дополнительную (локальную) компенсацию остаточного движения.
Пример скрипта:
Avisource("input.avi")
loadplugin("avisynth_c.dll")
loadCplugin("genmotion.dll")
i=converttoYV12()
f=GenMotion(i,filename="e:\deshaker.log",delta=1)
b=GenMotion(i,filename="e:\deshaker.log",delta=-1)
interleave(f,i,b)
loadCplugin("DeSpot.dll")
DeSpot(p1=40,p2=14,pwidth=30,pheight=30,mthres=22,mwidth=4,mheight=4,interlaced=false)
selectevery(3,1)
converttoYUY2()
Между прочим, затем вы можете загрузить этот AVS скрипт или результат в VirtualDub,
и выполнить второй проход Deshaker для стабилизации движения (и кодирования) фильтрованного клипа.
Благодарности
Благодарю Gunnar Thalin за детальную информацию о формате файла Deshaker.log
и очень полезные обсуждения.
Благодарю Kevin Atkinson за возможность использования Avisynth C интерфейса.
Формат лог файла Deshaker
В течение первого прохода, Deshaker пытается найти величины перемещений, поворота и зума, которые,
приложенные к текущему кадру, делают его похожим на предыдущий.
В файле информация записана по строке на кадр, в фиксированном текстовом формате (слева направо):
номер кадра (или поля), x- и y- смещение (в пикселах), поворот (в градусах) и множитель зума.
Вы можете редактировать лог файл вручную (но в строго фиксированном формате).
Вы можете также удалить строки, которые полностью ошибочны (Deshaker тоже ошибается).
Отсутствие строки с некоторыми номерами кадров трактуются как нулевое движение.
Если есть строки с теми же номерами кадров, используется последняя. Все как в самом Deshaker.
История версий:
Версия 0.1, 30 ноября 2003 - начальная (не публикована)
Версия 0.2, 7 декабря 2003 - добавлена поддержка чересстрочности (не публикована)
Версия 0.3, 13 декабря 2003 - добавлены субпиксельная точность, аспект пиксела (первая публичная)
Версия 0.4, 15 декабря 2003 - добавлена коррекция яркости
Версия 0.5, 28 декабря 2003 - скорректирована формула для delta<0 (спасибо Gunnar Thalin), некоторые погрешности
Версия 0.6, 05 апреля 2004 - добавлена кубическая интерполяция (как метод по умолчанию) ,
добавлен параметр grey, удален параметр deflick,
скорректировано вычисление первого и последнего кадра,
некоторая реорганизация, некоторая оптимизация скорости,
использован Avisynth C version 0.15,
выпущена с исходными текстами по GNU GPL 2
Версия 0.7, 08 апреля 2004 - добавлены параметры dxmax, dymax, rotmax, zoommax
Ограничения текущей версии:
Плагин работает только в YV12.
Не оптимизирован, медленный.
Лицензия
Данная программа представляет собой свободно распространяемый
программный продукт; вы можете распространять ее далее и\или изменять
на условиях Стандартной публичной лицензии GNU, опубликованной
"Free Software Foundation" -- либо ее версии номер 2, либо (по вашему
выбору) любой более поздней ее версии.
Распространяя данный программный продукт, мы надеемся что он окажется
полезным, но НЕ ДАЕМ НИКАКИХ ГАРАНТИЙ, даже подразумеваемой гарантии
ПРИГОДНОСТИ К КУПЛЕ-ПРОДАЖЕ или ИСПОЛЬЗОВАНИЮ В КОНКРЕТНЫХ ЦЕЛЯХ
(см. "Стандартную публичную лицензию GNU").
Вместе с данной программой вы должны были получить копию "Стандартной
публичной лицензии GNU"; если это не так, напишите в Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
(Суть: Вы можете модифицировать и программу и ее исходный код,
но все модификации с кодами должны распространяться на таких же условиях, свободно.
И не будет пиратства).
Прошу рассмотреть возможность финансовой поддержки, чтобы быть зарегистрированным пользователем.
Загрузить GenMotion версии 0.7
(Avisynth C интерфейса DLL включена)