Плагины для AviSynth 2.5
Copyright (C)2004-2016 Александр Г. Балахнин aka Fizick.
http://avisynth.org.ru
Данный пакет содержит средства (функции) для оценки глобального движения (панорамирования - проводки камеры, а также зума) в кадрах, и для полной или частичной его компенсации.
Он может быть использован для:
- компенсации глобального движения в соседних кадрах для сильного временного шумопонижения и реставрации;
- воссоздания поврежденных кадров путем интерполяции глобального движения;
- создания последовательности промежуточных кадров для изменения частоты кадров;
- частичной стабилизации движения.
Плагин DePan заменил мой экспериментальный GenMotion C-плагин (который использовал готовые данные о движении из лог файла VirtualDub плагина Deshaker).
Пакет работает в один проход, он состоит из серверной части (функции DePanEstimate) и одной или более клиентских частей (функций или их копий). Серверная функция оценивает данные по движению для кадров и передает их клиентским функциям по запросу. В качестве контейнера для данных по движению используется специальный служебный клип.
Эта функция использует метод фазового сдвига (путем быстрого преобразования Фурье - FFT) для оценки глобального движения.
Она использует некоторую центральную область каждого кадра (или поля) как окно FFT, чтобы найти межкадровую корреляцию и вычислить наиболее подходящие величины
вертикальных и горизонтальных сдвигов, которые подгоняют текущий кадр к предыдущему.
Некоторый относительный параметр корреляции используется как мера доверия и для обнаружения смены сцен.
В режиме вычисления зума, функция использует два окна в левой и правой части кадра чтобы оценить смещения и зум.
Выход функции - специальный служебный клип с закодированными в кадрах данными по движению, а также файл лога (протокола) с данными по движению.
DePanEstimate
( clip, int range, float trust, int winx, int winy, int wleft, int wtop, int dxmax, int dymax, float zoommax, float stab, float pixaspect, bool info, string log, bool debug, bool show, string extlog, bool fftw)
clip - входной клип;
range - число предыдущих (и также последующих) кадров (полей) подряд для оценки движения
(целое число >=0, по умолчанию=0);
trust - порог относительного превышения максимума корреляции над средним по спектру значением
при смене сцены (от 0.0 до 100.0, по умолчанию=4.0);
winx - ширина окна FFT (по умолчанию - максимально возможная степень 2);
winy - высота окна FFT (по умолчанию - максимально возможная степень 2);
wleft - левый отступ окна fft (по умолчанию = -1 для авто-центрирования).
wtop - верхний отступ окна fft window (по умолчанию = -1 для авто-центрирования).
dxmax - предел смещения по горизонтали ( по умолчанию=-1 для winx/4);
dymax - предел смещения по вертикали ( по умолчанию=-1 для winy/4);
zoommax - максимальный зум-фактор, если = 1 (по умолчанию), то зум не оценивается;
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, нет )
extlog - имя создаваемого выходного расширенного лог-файла протокола с данными по движению
и пареметру корреляции Trust (по умолчанию не создается);
fftw - использовать внешнюю библиотеку FFTW (всегда true с версии 1.9)
Замечание. Параметр trust определяет некоторую пороговую величину межкадрового подобия (корреляции). Он определяет, насколько подобен должен быть текущей кадр предыдущему в той же сцене. DePanEstimate зарегистрирует смену сцены для текущего кадра, если текущая величина корреляции ниже данного порога. Установите его ниже чтобы предотвратить ошибочное детектирование смены сцен, установите его выше чтобы предотвратить пропуск настоящих смен сцен (с тряской). Значение по умолчанию вполне подходит для большинства видео, но вы можете проверить это, включив режим info.
DePan (клиент) - делает полную или частичную компенсацию глобального движения
DePanInterleave (клиент) - генерирует длинный клип с чередующимися компенсированными кадрами
DePanStabilize (клиент) - делает частичную стабилизацию движения
DePanScenes(клиент) - отмечает изменение сцен
Генерирует клип, в котором глобальное движение полностью или частично скомпенсировано,
используя данные по движению, вычисляемые функцией DePanEstimate (или из лог-файла).
DePan
(clip, clip data, float offset, int subpixel, float pixaspect, bool matchfields, int mirror, int blur, bool info, string inputlog)
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 комбинирует функцию 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)
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
(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, int method)
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);
значения данных пределов ограничивают коррекцию (c версии 1.7 - приблизительно, нестрого )
Если отрицательные, то абсолютное значение являтся порогом для новой стабилизации с этого кадра.
subpixel - точность интерполяции пикселов (точек) при компенсации движения (по умолчанию = 2):
0 - по ближайшему исходному пикселу, без интерполяции (быстро);
1 - субпиксельная точность с билинейной интерполяцией (сглаженно);
2 - субпиксельная точность с бикубической интерполяцией (наилучше).
pixaspect - аспект (вытянутость) пиксела (по умолчанию = 1.0);
fitlast - подгонка последних кадров к оригинальным позициям (интервал, по умолчанию=0);
tzoom - время подъема адаптивного зума, секунд (по умолчанию=3.0);
info - показать ли информацию по стабилизации движения на кадре ( по умолчанию= false, нет);
inputlog - имя входного лог-файла с информацией по движению в формате Deshaker (по умолчанию - не читать)
method - используемый метод стабилизации:
0 - инерциальный (по умолчанию);
Ряд параметров (в том числе dxmax, dymax, rotmax, zoommax, fitlast) используются только в этом методе
. 1 - двунаправленного усреднения;
2 - неограниченная (статическая) стабилизация;
-1 - следящее движение (трекинг) базового (первого) кадра вместо стабилизации
Генерирует клип со значениями пикселов =255 для определенной плоскости для кадра при смене сцены и =0 для других кадров,
используя данные по движению, определенные DePanEstimate.
Может быть использована функцией типа AverageLuma для условной обработки.
DePanScenes
( clip, string inputlog, int plane)
clip -входной клип специальный клип с данными по движению, производимый DePanEstimate)
inputlog - имя входного лога в формате Deshaker (по умолчанию - не читать)
plane - код плоскости с отметкой (1 - Y, 2 - U, 4 - V, сумма - комбинация, по умолчанию=1)
1. Работает только в форматах цвета YV12 и YUY2.
2. Оценивает только смещения (панорамирование) и зум (не вращение), но это дает преимущества по скорости и стабильности. Оценка зума не очень точна.
3. Исходный клип должен иметь ту же длину что и клип с данными по движению.
4. Прямо работает только с прогрессивными клипами. Для чересстрочных источников, вы должны использовать предшествующую Avisynth-команду SeparateFields
и последующую Weave
(после компенсации движения и шумопонижения), с AssumeTTF
и AssumeBFF.
Плагин оценивает и вычисляет движение от одного поля к соседнему (по времени) полю (из того же или следующего кадра). Для сохранения порядка (доминантности) полей и наилучшего шумопонижения, установите параметр MatchFields=true.
5. Режим mirror(зеркало) является уникальным, но немного странным :-). Используйте blur чтобы скрыть резкие отраженные детали. Замечание: blur пока не реализован для вращения.
6. Не очень быстрый, без оптимизации ассемблером моих функций.
7. Тестирован с версиями Avisynth 2.5.3, 2.5.4, 2.5.5, 2.5.6, 2.5.7, 2.5.8, 2.6.0.
8. Старые версии использовали открытый FFT2D код Takuya Ooura (http://momonga.t.u-tokyo.ac.jp/~ooura/index.html)
Теперь DePanEstimate использует только более быструю библиотеку 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\SYSTEM32). DePanEstimate не будет работать без этого!
9. Для лучших результатов, вы можете временно добавить параметр Info, анализировать информацию и подобрать значения параметров Trust и т.п.
10. Вы также можете использовать не строго одинаковые клипы для оценки движения и для компенсации, например попробовать добавить предварительную фильтрацию, подстройку яркости-контраста, маскирование, обрезку клипа, используемого для оценки движения (и использовать другую обработку для выходного компенсируемого-стабилизировуемого клипа).
1. Загрузите оригинальный (входной) клип (I),
2. Сделайте клип (F) с полной компенсацией вперед,
3. Сделайте клип (B) с полной компенсацией назад,
4. Сделайте клип чередования, с компенсированными кадрами перед и после каждого оригинального кадра;
Вы получите длинный клип (с утроенной длиной), с каждыми тремя последовательными кадрами, соответствующими тому же времени.
5. Примените некоторый динамический фильтр, который использует разницу пикселов между предыдущим,
текущим и следующим кадром в группе, например фильтр Fluxsmooth
.
6. Выберите каждый третий (оригинальный не-компенсированный но очищенный) кадр на выход. Очищенный клип не будет иметь много артефактов, производимых глобальным движением с шумопонижением, и шумопонижение будет более сильным в большинстве областей (благодаря компенсации движения).
Замечание: с DePanInterleave
, стадии 2,3,4 объединены в единую. Кроме того, радиус может быть больше чем 1.
Avisource("input.avi") LoadPlugin("depanestimate.dll") # или используйте автозагрузку LoadPlugin("depan.dll") # или используйте автозагрузку loadplugin("fluxsmooth.dll") i=converttoYV12() mdata=DePanEstimate(i) DePanInterleave(i,data=mdata) fluxsmooth() selectevery(3,1)
Avisource("input.avi") LoadPlugin("depanestimate.dll") # или используйте автозагрузку 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") LoadPlugin("depanestimate.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 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("depanestimate.dll") # или используйте автозагрузку 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 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("depanestimate.dll") # или используйте автозагрузку LoadPlugin("depan.dll") ConvertToYV12() fps3to5()
Замечание. Есть более простой и общий альтернативный способ смены частоты: попробуйте функцию ChangeFPS
с последующим DePanStabilize
DePan может быть использован как средство для сглаживания глобального движения (тряски).
Простой пример скрипта для стабилизации прогрессивного клипа::
Avisource("input.avi") LoadPlugin("depanestimate.dll") # или используйте автозагрузку loadplugin("depan.dll") i=converttoYV12() mdata=DePanEstimate(i) DePanStabilize(i,data=mdata)
Вы можете добавить и настроить параметры определяющие частоту среза (Cutoff), метод заполнения пустых краев и т.д., наиболее соответствующие вашему клипу.
Создает файл с номерами кадров при смен сцен. Проиграйте весь клип.
LoadPlugin("depanestimate.dll") # или автозагрузкой LoadPlugin("depan.dll") # или автозагрузкой filename="test.log" avisource("g:\test.avi") ConvertToYV12(interlaced=false) data=DepanEstimate(trust=2.5) WriteFileIf(filename, "(AverageLuma(DepanScenes(data))>30)" , "current_frame")
Функция DepanEstimate может создавать выходной лог файл с данными по движению, в формате совместимом с плагином Deshaker.
Кроме того, Depan может читать такие лог файлы (в этом режиме он работает как плагин GenMotion, без DepanEstimate, клип с данными игнорируется, и тогда в качестве такого ложного клипа может быть использован исходный клип ).
Файл лога Deshaker может быть загружен в Depan и наоборот. Depan также может компенсировать зум и вращение.
Следовательно, вы можете загрузить подобные AVS скрипт файлы в VirtualDub, и выполнить второй проход Deshaker для продвинутой стабилизации движения (и кодирования) отфильтрованного клипа. Конечно, перед этим вы должны прогнать первый проход DePanEstimate чтобы сделать лог файл, который будет указан в Deshaker.
Вместо этого, вы можете добавить в скрипт функцию DePanStabilize(i,data)
и выполнить все (оценку движения, компенсацию движения, шумопонижение и стабилизацию движения) в один проход !
С версии 1.9.2 возможно записать расширенный лог-файл с дополнительной информации о параметре корреляции "Trust" для кадров.
В течение первого прохода, 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 (и MDepan версии 2) может быть использована вместо функции DePanEstimate. Она может оценивать панорамирование, зум и вращение.
Некоторая дискуссия о плагинах 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 и многих других за полезные обсуждения и доклады об ошибках.
Плагины Depan и DePanEstimate - это программы, распространяемая на условиях лицензии GNU GPL. Смотри gpl-rus.txt.
Покументация распространяется на условиях лицензии CreativeCommons BY-SA 3.0 license.
Прошу рассмотреть возможность финансовой поддержки.
Download DePan tools version 1.13.1