DePan

Общая информация

автор: Александр Г. Балахнин aka Fizick
версия: 1.7
закачка: http://avisynth.org.ru/
категория: Разнообразные плагины
требования: цветовой формат YV12 или YUY2

Cредства для оценки и компенсации глобального движения (панорамирования)

Введение

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

DePan может быть использован для:
- компенсации глобального движения в соседних кадрах для сильного временного  шумопонижения и реставрации;
- воссоздания поврежденных кадров путем интерполяции глобального движения;
- создания последовательности промежуточных кадров для изменения частоты кадров;
- частичной стабилизации движения.

  Плагин DePan заменил мой экспериментальный GenMotion C-плагин (который использовал готовые данные о движении из лог файла VirtualDub плагина Deshaker).

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

Текущая версия DePan использует специальный сервисный клип как контейнер для данных по движению.

    Функции плагина DePan:

DePanEstimate (сервер) - оценивает глобальное движение и пишет его в специальный служебный клип
DePan (клиент) - делает полную или частичную компенсацию глобального движения
DePanInterleave (клиент) - генерирует длинный клип с чередующимися компенсированными кадрами
DePanStabilize (клиент) - делает частичную стабилизацию движения
DePanScenes(клиент) - отмечает изменение сцен

    Функция DePanEstimate

    Эта функция использует метод фазового сдвига (путем быстрого преобразования Фурье - 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")

Параметры DePanEstimate:

clip - входной клип;
range - число предыдущих (и также последующих) кадров (полей) подряд для оценки движения
 (целое число >=0, по умолчанию=1);
trust - порог относительного превышения максимума корреляции над средним по спектру значением
     при смене сцены (от 0.0 до 100.0, по умолчанию=4.0);
winx - ширина окна FFT (должна быть степенью двойки если не fftw (по умолчанию - максимально возможная степень 2);
winy - высота окна FFT (должна быть степенью двойки если не fftw (по умолчанию - максимально возможная степень 2);
dxmax - предел смещения по горизонтали ( по умолчанию= winx/4);
dymax - предел смещения по вертикали ( по умолчанию= winy/4);
zoommax - максимальный зум-фактор,  если  = 1 (по умолчанию), то зум не оценивается;
improve - улучшить оценку зума путем итерации (по умолчанию = false, нет ). Этот режим отменен с версии 1.6
stab -  снижает вычисленную корреляцию для больших смещений ( множитель вида dxmax/(dxmax + stab*abs(dx)) ):
    =0.0 (по умолчанию) - не снижать,
    =1.0 - снижать наполовину для смещений dxmax, dymax.
pixaspect - аспект (вытянутость) пиксела (по умолчанию= 1.0);
info - показать ли информацию по движению на кадре ( по умолчанию= true, да);
log - имя создаваемого выходного лог-файла протокола с данными по движению
     (в формате VirtualDub плагина Deshaker ) (по умолчанию не создается);
debug - выводить ли отладочные данные для утилиты  DebugView  (по умолчанию = false, нет );
show - показывать корреляционную поверхность (по умолчанию = false, нет )
fftw - использовать внешнюю библиотеку FFTW (по умолчанию = false, использовать внутренний код Ooura FFT2D )

Замечание. Параметр trust определяет пороговую величину межкадрового подобия (корреляции). Он определяет, насколько подобен должен быть текущей кадр предыдущему в той же сцене. DePan зарегистрирует смену сцены для текущего кадра, если текущая величина корреляции ниже данного порога. Установите его ниже чтобы предотвратить ошибочное детектирование смены сцен, установите его выше чтобы предотвратить пропуск настоящих смен сцен.    Значение по умолчанию вполне подходит для большинства видео, но вы можете проверить это, включив режим info.

    Функция DePan

 Генерирует клип, в котором глобальное движение полностью или частично скомпенсировано,
используя данные по движению, вычисляемые функцией DePanEstimate (или из лог-файла).

Вызов:

DePan (clip, clip "data", float "offset", int "subpixel", float "pixaspect", bool "matchfields", int "mirror", int "blur", bool "info", string "inputlog")

 Параметры DePan:

clip - входной клип (тот же самый что и для DePanEstimate);
data - специальный служебный клип с данными по движению, производимый DePanEstimate;
offset - величина смещения для компенсации движения входных кадров (полей) (по умолчанию =0)
 = 0 значит отсутствие изменений;
 = -1.0 значит полная компенсация назад, следующего (n+1) кадра (поля) к текущему (n);
 = 1.0 значит полная компенсация вперед, предыдущего (n-1) кадра (поля) к текущему (n);
 = -0.5 значит частичная компенсация назад, следующего (n+1) кадра (поля) к текущему (n) наполовину ;
 = 0.5 значит частичная компенсация вперед, предыдущего (n-1) кадра (поля) к текущему (n) наполовину;
 = 0.3333333 значит частичная компенсация вперед, предыдущего (n-1) кадра (поля) к текущему (n) на одну треть;
 = -1.5 значит частичная компенсация назад, следующего следующего (n+2) кадра (поля)  к текущему (n) наполовину;
 = 2.0 значит полная компенсация вперед, предыдущего предыдущего (n-2) кадра (поля) к текущему (n);
      и т.д. и т.п.
subpixel - точность интерполяции пикселов (точек) при компенсации движения (по умолчанию = 2):
    0 - по ближайшему исходному пикселу, без интерполяции (быстрая);
    1 - субпиксельная точность с билинейной интерполяцией (сглаженная);
    2 - субпиксельная точность с бикубической интерполяцией (резкая).
pixaspect - аспект (вытянутость) пиксела (по умолчанию= 1.0);
matchfields - подогнать ли вертикальное положение полей чересстрочного клипа для сохранения порядка полей,
    лучшего шумопонижения и т.п. (по умолчанию = true)
mirror - режим заполнения пустых краев зеркально отраженными от границ кадра пикселами (вместо черных):
    0 - нет отражения (по умолчанию);
    1 - верх;
    2 - них;
    4 - лево;
    8 - право;
    сумма любых вышеуказанных - комбинация (15 - все ).
blur - блюрить отраженные зоны с заданной максимальной длиной размывания (по умолчанию=0, не блюрить;   хорошие значения выше 30)
info - показать ли информацию по компенсации движения на кадре ( по умолчанию= false, нет);
inputlog - имя входного лог-файла с информацией по движению в формате Deshaker (по умолчанию - не читать)

Замечание. Параметр "offset" функции DePan является расширенной версией параметра "delta" плагина GenMotion.

    Функция DePanInterleave

 Генерирует длинный клип с чередующимися группами компенсированных кадров
в следующем порядке:  один или несколько (в некотором диапазоне) предыдущих компенсированных кадров ,
оригинальный кадр, один или несколько (в некотором диапазоне) последующих компенсированных кадров,
 далее такая же группа для следующего кадра и т.д.

Фактически, функция DePanInterleave комбинирует функцию DePan и функцию Interleave (встроенную в Avisynth) для удобной подготовки к  динамическому шумопронижению, с  последующей функцией SelectEvery(prev+next+1, prev)для выбора только оригинальных (но очищенных) кадров.

Вызов и параметры DePanInterleave подобны параметрам DePan:

DePanInterleave (clip, clip "data", int "prev", int "next, int "subpixel", float "pixaspect", bool "matchfields", int "mirror", int "blur", bool "info", string "inputlog")

Параметры DePanInterleave

clip - входной клип (тот же самый что и для DePanEstimate);
data - специальный служебный клип с данными по движению, производимый DePanEstimate;
prev - число предыдущих  кадров (полей) в группе  для компенсации движения     (целое, по умолчанию =1);
next - число последующих  кадров (полей) в группе  для компенсации движения     (целое, по умолчанию =1);
subpixel - точность интерполяции пикселов (точек) при компенсации движения (по умолчанию = 1):
    0 - по ближайшему исходному пикселу, без интерполяции (быстрая);
    1 - субпиксельная точность с билинейной интерполяцией (сглаженная);
    2 - субпиксельная точность с бикубической интерполяцией (резкая).
pixaspect - аспект (вытянутость) пиксела (по умолчанию= 1.0);
matchfields - подогнать ли вертикальное положение полей чересстрочного клипа для сохранения порядка полей,
    лучшего шумопонижения и т.п. (по умолчанию = true)
mirror - режим заполнения пустых краев зеркально отраженными от границ кадра пикселами (вместо черных):
    0 - нет отражения (по умолчанию);
    1 - верх;
    2 - них;
    4 - лево;
    8 - право;
    сумма любых вышеуказанных - комбинация (15 - все ).
blur - блюрить отраженные зоны с заданной максимальной длиной размывания (по умолчанию=0, не блюрить;   хорошие значения выше 30)
info - показать ли информацию по компенсации движения на кадре ( по умолчанию= false, нет);
inputlog - имя входного лог-файла с информацией по движению в формате Deshaker (по умолчанию - не читать)  

    Функция DePanStabilize

 Делает частичную стабилизацию движения путем сглаживания смещений.

Текущая версия использует инерциальный метод (видимо подобный используемому в 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")

Параметры DePanStabilize:

clip - входной клип (тот же самый что и для DePanEstimate);
data - специальный служебный клип с данными по движению, производимый DePanEstimate;
cutoff - частота среза подавляемых вибраций, Герц (по умолчанию = 1.0);
damping - относительный коэффициент демпфирования (по умолчанию = 0.9);
initzoom - начальный (минимальный) зум для заполнения краев (по умолчанию=1.0);
addzoom - добавить адаптивный зум для заполнения краев (по умолчанию=false);
prev -  отстояние некоторого предыдущего кадра, используемого для заполнения краев 
     0  - не заполнять (по умолчанию);
    1 - использовать ближайший предыдущий (n-1)  кадр для заполнения,
    2 - использовать отстоящие на 2 кадры (n-2),
    и т.д.
next -  отстояние некоторого  будущего кадра, используемого для заполнения краев 
     0  - не заполнять (по умолчанию);
    1 - использовать ближайший  следующий (n+1) кадр для заполнения,
    2 - использовать отстоящие на 2 кадры (n+2),
    и т.д.
mirror - режим заполнения пустых краев зеркально отраженными от границ кадра пикселами (вместо черных):
    0 - нет отражения (по умолчанию);
    1 - верх;
    2 - них;
    4 - лево;
    8 - право;
    сумма любых вышеуказанных - комбинация (15 - все ).
blur - максимальная длина размывания (блюра) отраженных зон (по умолчанию=0, не блюрить; хорошие значения выше 30)
dxmax - предел горизонтальной коррекции, в пикселах (по умолчанию= 60);
dymax - предел вертикальной коррекции, в пикселах (по умолчанию= 30);
zoommax - предел коррекции зума (только адаптивный зум, по умолчанию= 1.05);
rotmax - предел коррекции поворота, в градусах (по умолчанию= 1.0);
    (если значение любого максимального параметра положительно, величина коррекции ограничивается данным значением,
    если  отрицательно, то сбрасывается в ноль и данный кадр (поле) считается новым базовым )
subpixel - точность интерполяции пикселов (точек) при компенсации движения (по умолчанию = 2):
    0 - по ближайшему исходному пикселу, без интерполяции (быстро);
    1 - субпиксельная точность с билинейной интерполяцией (сглаженно);
    2 - субпиксельная точность с бикубической интерполяцией (наилучше).
pixaspect - аспект (вытянутость) пиксела (по умолчанию = 1.0);
fitlast - подгонка последних кадров к оригинальным позициям (интервал, по умолчанию=0);
tzoom - время подъема адаптивного зума, секунд (по умолчанию=3.0);
info - показать ли информацию по стабилизации движения на кадре ( по умолчанию= false, нет);
inputlog - имя входного лог-файла с информацией по движению в формате Deshaker (по умолчанию - не читать)  

    Функция DePanScenes

Генерирует клип со значениями пикселов =255 для определенной плоскости для кадра при смене сцены и  =0 для других кадров,
используя данные по движению, определенные DePanEstimate.

 Может быть использована функцией типа AverageLuma для условной обработки.

Вызов:

DePanScenes ( clip, string inputlog, int plane)

Параметры DePanScenes:

clip -входной клип специальный клип с данными по движению, производимый  DePanEstimate)
inputlog - имя входного лога в формате Deshaker  (по умолчанию - не читать)
plane - код плоскости с отметкой (1 - Y, 2 - U, 4 - V, сумма - комбинация, по умолчанию=1)  

   Особенности и ограничения текущей версии плагина DePan 

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. Вы также можете использовать не строго одинаковые клипы для оценки движения и для компенсации, например попробовать добавить предварительную фильтрацию, подстройку яркости-контраста, маскирование, обрезку  клипа, используемого для оценки движения (и использовать другую обработку для выходного компенсируемого-стабилизировуемого клипа).

Использование DePan

Использование DePan для подготовки компенсированного клипа чередования с последующим сильным динамическим шумопонижением


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 для изменения частоты кадров

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 для стабилизации движения

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 (Gunnar Thalin)

    В течение первого прохода, Deshaker пытается найти величины перемещений, поворота и зума, которые, приложенныек текущему кадру, делают его похожим на предыдущий.
В файле информация записана по строке на кадр, в фиксированном текстовом формате (слева направо):
номер кадра (или поля), x- и y- смещение (в пикселах), поворот (в градусах) и множитель зума.
Вы можете редактировать лог файл вручную (но в строго фиксированном формате).
Вы можете также удалить строки, которые полностью ошибочны (Deshaker тоже ошибается).
Отсутствие строки с некоторыми номерами кадров трактуются как нулевое движение.
Если есть строки с теми же номерами кадров, используется последняя. Все как в самом Deshaker.
Замечание. Для чересстрочного формата, информация пишется для каждого поля (A- первое по времени, B - второе).

    Формат кадрового буфера DePan для обмена клиент-сервер  (в основном для программистов)

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.

    Дополнительная информация о DePan

Некоторая дискуссия о плагинах 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