Cредства для оценки и компенсации глобального движения (панорамирования)
Плагин DePan содержит средства (функции) для оценки глобального движения (панорамирования - проводки камеры, а также зума) в кадрах, и для полной или частичной его компенсации.
DePan может быть использован для:
- компенсации глобального движения в соседних кадрах для сильного временного шумопонижения и реставрации;
- воссоздания поврежденных кадров путем интерполяции глобального движения;
- создания последовательности промежуточных кадров для изменения частоты кадров;
- частичной стабилизации движения.
Плагин DePan заменил мой экспериментальный GenMotion C-плагин (который использовал готовые данные о движении из лог файла VirtualDub плагина Deshaker).
DePan работает в один проход, но состоит из серверной части (функции) и одной или более клиентских частей (функций или их копий). Серверная функция оценивает данные по движению для кадров и передает их клиентским функциям по запросу.
Текущая версия DePan использует специальный сервисный клип как контейнер для данных по движению.
Эта функция использует метод фазового сдвига (путем быстрого преобразования Фурье - FFT) для оценки глобального движения.
Она использует некоторую центральную область каждого кадра (или поля) как окно FFT, чтобы найти межкадровую корреляцию и вычислить наиболее подходящие величины вертикальных и горизонтальных сдвигов, которые подгоняют текущий кадр к предыдущему.
Некоторый относительный параметр корреляции используется как мера доверия и для обнаружения смены сцен.
В режиме вычисления зума, функция использует два окна в левой и правой части кадра чтобы оценить смещения и зум.
Выход функции - специальный служебный клип с закодированными в кадрах данными по движению, а также файл лога (протокола) с данными по движению.
DePanEstimate
( clip, int "range", float "trust", int "winx", int "winy", int "dxmax", int "dymax", float "zoommax", bool "improve", float "stab", float "pixaspect", bool "info", string "log", bool "debug", bool "show", bool "fftw")
Замечание. Параметр trust определяет пороговую величину межкадрового подобия (корреляции). Он определяет, насколько подобен должен быть текущей кадр предыдущему в той же сцене. DePan зарегистрирует смену сцены для текущего кадра, если текущая величина корреляции ниже данного порога. Установите его ниже чтобы предотвратить ошибочное детектирование смены сцен, установите его выше чтобы предотвратить пропуск настоящих смен сцен. Значение по умолчанию вполне подходит для большинства видео, но вы можете проверить это, включив режим info.
Генерирует клип, в котором глобальное движение полностью или частично скомпенсировано,
используя данные по движению, вычисляемые функцией DePanEstimate (или из лог-файла).
DePan
(clip, clip "data", float "offset", int "subpixel", float "pixaspect", bool "matchfields", int "mirror", int "blur", bool "info", string "inputlog")
Генерирует длинный клип с чередующимися группами компенсированных кадров
в следующем порядке: один или несколько (в некотором диапазоне) предыдущих компенсированных кадров ,
оригинальный кадр, один или несколько (в некотором диапазоне) последующих компенсированных кадров,
далее такая же группа для следующего кадра и т.д.
Фактически, функция DePanInterleave комбинирует функцию DePan и функцию Interleave (встроенную в Avisynth) для удобной подготовки к динамическому шумопронижению, с последующей функцией SelectEvery(prev+next+1, prev)
для выбора только оригинальных (но очищенных) кадров.
DePanInterleave
(clip, clip "data", int "prev", int "next, int "subpixel", float "pixaspect", bool "matchfields", int "mirror", int "blur", bool "info", string "inputlog")
Делает частичную стабилизацию движения путем сглаживания смещений.
Текущая версия использует инерциальный метод (видимо подобный используемому в Digistudio для VirtualDub).
DePanStabilize
(clip, clip "data", float "cutoff", float "damping", float "initzoom", bool "addzoom", int "prev", int "next", int "mirror", int "blur", int "dxmax", int "dymax", float "zoommax", float "rotmax", int "subpixel", float "pixaspect", int "fitlast", float "tzoom", bool "info", string "inputlog")
Генерирует клип со значениями пикселов =255 для определенной плоскости для кадра при смене сцены и =0 для других кадров,
используя данные по движению, определенные DePanEstimate.
Может быть использована функцией типа AverageLuma для условной обработки.
DePanScenes
( clip, string inputlog, int plane)
1. Работает только в формате цвета YV12 или YUY2.
2. Оценивает только смещения (панорамирование) и зум (не вращение), но это дает преимущества по скорости и стабильности. Оценка зума не очень точна.
3. Исходный клип должен иметь ту же длину что и клип с данными по движению.
4. Прямо работает только с прогрессивными клипами. Для чересстрочных источников, вы должны использовать предшествующую Avisynth-команду SeparateFields
и последующую Weave
(после компенсации движения и шумопонижения), с AssumeTTF
и AssumeBFF.
Плагин оценивает и вычисляет движение от одного поля к соседнему (по времени) полю (из того же или следующего кадра). Для сохранения порядка (доминантности) полей и наилучшего шумопонижения, установите параметр MatchFields=true.
5. Режим mirror(зеркало) является уникальным, но немного странным :-). Используйте blur чтобы скрыть резкие отраженные детали.
6. Не очень быстрый, без оптимизации ассемблером моих функций.
7. Тестирован с версией Avisynth 2.5.3 и 2.5.5.
8. Функция использует открытый FFT2D код Takuya Ooura (http://momonga.t.u-tokyo.ac.jp/~ooura/index.html)
С версии 1.0, DePan также может использовать более быструю библиотеку FFTW версии 3 (http://www.fftw.org)
как Windows бинарную DLL (скомпилированную gcc под MinGW by Alessio Massaro),
которая поодерживает нити и AMD K7 (3dNow!) в добавок к SSE/SSE2.
Она может быть загружена с ftp://ftp.fftw.org/pub/fftw/fftw3win32mingw.zip
Для использования fftw , вы должны положить FFTW3.DLL файл из пакета в некоторый каталог в путях (например, C:\WINNT).
9. Для лучших результатов, вы можете временно добавить параметр Info, анализировать информацию и подобрать значения параметров Trust и т.п.
10. Вы также можете использовать не строго одинаковые клипы для оценки движения и для компенсации, например попробовать добавить предварительную фильтрацию, подстройку яркости-контраста, маскирование, обрезку клипа, используемого для оценки движения (и использовать другую обработку для выходного компенсируемого-стабилизировуемого клипа).
1. Загрузите оригинальный (входной) клип (I),
2. Сделайте клип (F) с полной компенсацией вперед,
3. Сделайте клип (B) с полной компенсацией назад,
4. Сделайте клип чередования, с компенсированными кадрами перед и после каждого оригинального кадра;
Вы получите длинный клип (с утроенной длиной), с каждыми тремя последовательными кадрами, соответствующими тому же времени.
5. Примените некоторый динамический фильтр, который использует разницу пикселов между предыдущим,
текущим и следующим кадром в группе, например фильтр Fluxsmooth
.
6. Выберите каждый третий (оригинальный не-компенсированный но очищенный) кадр на выход. Очищенный клип не будет иметь много артефактов, производимых глобальным движением с шумопонижением, и шумопонижение будет более сильным в большинстве областей (благодаря компенсации движения).
Замечание: с DePanInterleave
, стадии 2,3,4 объединены в единую. Кроме того, радиус может быть больше чем 1.
Avisource("input.avi") loadplugin("depan.dll") loadplugin("fluxsmooth.dll") i=converttoYV12() mdata=DePanEstimate(i) DePanInterleave(i,data=mdata) fluxsmooth() selectevery(3,1)
Avisource("input.avi") loadplugin("depan.dll") loadplugin("fluxsmooth.dll") converttoYV12() AssumeTFF() i=SeparateFields() mdata=DePanEstimate(i, range=1,trust=5.5, log="depan.log") DePanInterleave(i,data=mdata, prev=1, next=1, matchfields=true) fluxsmooth() selectevery(3,1) Weave()
Можно и разделить клип на четные и нечетные поля, или использовать bob-деинтерлейс с последующим восстановлением.
Тестируйте, чтобы пополнить список!
Для предложенного метода фильтрации с DePan (ранее с GenMotion),
такой временной фильтр должен сравнивать пиксел с предыдущим и последующим кадром,
и делать сглаживание только если разница между предыдущим и последующим мала.
Эти фильтры также могут выполнять дополнительную (локальную) компенсацию остаточного движения
DePan может быть использован как средство для преобразования частоты кадров и подобных задач.
Например, чтобы изменить частоту кадров в 1,5 раза, из 16.666 fps (прогрессивный старый 8 мм кинофильм) в 25 fps,
можно применить скрипт:
loadplugin("depan.dll") Avisource("kino.avi") data=DePanEstimate(i,range=1,trust=5) i=ConvertToYV12() f1_3=DePan(i,data,offset=1./3) b1_3=DePan(i,data,offset=-1./3) interleave(f1_3,i,b1_3) selectevery(6,0,1,2)
Это может быть записано с использованием функции:
function fps2to3(clip) { # change FPS from 2 to 3 (or 16.66 to 25, or 20 to 30 and so on), i.e. with factor=3/2 # uses global motion compensation # input clip must be YV12 or YUY2 progressive (or separated fields probably ?) data = DePanEstimate(clip) f1_3 = DePan(clip, data, offset=1./3) b1_3 = DePan(clip, data, offset=-1./3) Interleave(f1_3, clip, b1_3) SelectEvery(6, 0, 1, 2) } AviSource("e:\video.avi") LoadPlugin("depan.dll") ConvertToYV12() fps2to3()Вот возможная функция для преобразования частоты кадров (прогрессивных) с фактором=5/3, например из 15 fps в 25 fps :
function fps3to5(clip) { # change FPS from 3 to 5 (or 15 to 25, or 18 to 30 and so on), i.e. with factor=5/3 # uses global motion compensation # input clip must be YV12 or YUY2 progressive (or separated fields probably ?) data = DePanEstimate(clip) t3_5 = DePan(clip, data, offset=-2./5) t6_5 = DePan(clip, data, offset=1./5).trim(2,0) t9_5 = DePan(clip, data, offset=-1./5).trim(1,0) t12_5 = DePan(clip, data, offset=2./5).trim(3,0) Interleave(clip, t3_5, t6_5, t9_5, t12_5) SelectEvery(15,0,1,2,3,4) } AviSource("e:\video.avi") LoadPlugin("depan.dll") ConvertToYV12() fps3to5()
Замечание. Есть более простой и общий альтернативный способ смены частоты: попробуйте функцию ChangeFPS
с последующим DePanStabilize>
DePan может быть использован как средство для сглаживания глобального движения (тряски).
Простой пример скрипта для стабилизации прогрессивного клипа::
Avisource("input.avi") loadplugin("depan.dll") i=converttoYV12() mdata=DePanEstimate(i) DePanStabilize(i,data=mdata)
Вы можете добавить и настроить параметры, определяющие частоту среза (Cutoff), метод заполнения пустых краев и т.д., наиболее соответствующие вашему клипу.
Функция DepanEstimate может создавать выходной лог файл с данными по движению, в формате совместимом с плагином Deshaker.
Кроме того, Depan может читать такие лог файлы (в этом режиме он работает как плагин GenMotion, без DepanEstimate, клип с данными игнорируется, и тогда в качестве такого ложного клипа может быть использован исходный клип ).
Файл лога Deshaker может быть загружен в Depan и наоборот. Depan также может компенсировать зум и вращение.
Следовательно, вы можете загрузить подобные AVS скрипт файлы в VirtualDub, и выполнить второй проход Deshaker для продвинутой стабилизации движения (и кодирования) отфильтрованного клипа. Конечно, перед этим вы должны прогнать первый проход DePanEstimate чтобы сделать лог файл, который будет указан в Deshaker.
Вместо этого, вы можете добавить в скрипт функцию DePanStabilize(i,data)
и выполнить все (оценку движения, компенсацию движения, шумопонижение и стабилизацию движения) в один проход !
В течение первого прохода, Deshaker пытается найти величины перемещений, поворота и зума, которые, приложенныек текущему кадру, делают его похожим на предыдущий.
В файле информация записана по строке на кадр, в фиксированном текстовом формате (слева направо):
номер кадра (или поля), x- и y- смещение (в пикселах), поворот (в градусах) и множитель зума.
Вы можете редактировать лог файл вручную (но в строго фиксированном формате).
Вы можете также удалить строки, которые полностью ошибочны (Deshaker тоже ошибается).
Отсутствие строки с некоторыми номерами кадров трактуются как нулевое движение.
Если есть строки с теми же номерами кадров, используется последняя. Все как в самом Deshaker.
Замечание. Для чересстрочного формата, информация пишется для каждого поля (A- первое по времени, B - второе).
Depan использует фрейм-буфер специального клипа для хранения данных по движению.
Когда клиент (depan) запрашивает данные по движению для кадра n
из этого клипа, сервер (DepanEstimate) создает кадр и пишет в него нужные данные (в начало фрейм-буфера): заголовок, и несколько записей по движению для кадров, от n-range
до n+range
(nframes = 2*range+1
для некрайних кадров).
Определение данных по движению такое же, как в логе Deshaker.
Я использую следующие структуры в текущей версии:
#define DEPANSIGNATURE "depan06" typedef struct depanheaderstruct { // structure of depandata header in framebuffer char signature[8]; // signature for check of data valid int reserved; // for future using int nframes; // number of records with frames motion data in current framebuffer } depanheader; typedef struct depandatastruct { // structure of every frame motion data record in framebuffer int frame; // frame number float dx; // x shift (in pixels) for this frame float dy; // y shift (in pixels, corresponded to pixel aspect = 1) float zoom; // zoom float rot; // rotation (in degrees), (now =0 - no rotation estimated data in current version) } depandata;
Замечание 1. Depan использует значение dx=0.0 как признак смены сцены.
Замечание 2. Выходные кадры DepanEstimate обрезаны, если не включен режим просмотра.
Некоторое время назад я добавил в плагин оценки локального движения MVTools от Manao (в версию 0.9.8.2) новую функцию MVDepan оценки глобального движения. Она работает на основе анализа векторов движений малых блоков, подобно первому проходу плагина Deshaker. Функция MVDepan может быть использована вместо функции DePanEstimate. Она может оценивать панорамирование, зум и вращение, но является пока экспериментальной бета-версией.
Ищите новейшие версии плагина MVTools, и документацию на сайте Manao . Обсуждение на форуме doom9 по AviSynth.
Некоторая дискуссия о плагинах GenMotion и DePan и смежных вопросах может быть найдена на форуме AviSynth
http://forum.doom9.org/forumdisplay.php?s=&forumid=33
и в частности в ветке http://forum.doom9.org/showthread.php?s=&threadid=66686
Или обращайтесь на русскоязычный форум http://forum.ixbt.com, конференция по видеозахвату,
ветка "Экстремальный Ависинт" http://forum.ixbt.com/topic.cgi?id=29:9331
Благодарю Gunnar Thalin за детальную информацию о формате лог-файла Deshaker и очень полезные обсуждения.
Благодарю Takuya Ooura за возможность использования свободного и быстрого кода FFT2D.
Благодарю scharfis_brain и многих других за полезные обсуждения и доклады об ошибках.
Эта программа распространяется свободно, но без всяких гарантий.
$English Date: 2006/09/17 20:11:57 $
Русский текст 17.09.2006 Fizick http://bag.hotmail.ru
b