# DePan & DePanEstimate

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

Плагины для AviSynth 2.5
Copyright (C)2004-2007 Александр Г. Балахнин aka Fizick.
http://avisynth.org.ru

## Введение

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

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

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

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

## Функции плагина DePanEstimate:

### Функция 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, string extlog, 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, нет )
extlog - имя создаваемого выходного расширенного лог-файла протокола с данными по движению
и пареметру корреляции Trust (по умолчанию не создается);
fftw - использовать внешнюю библиотеку FFTW (всегда true с версии 1.9)

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

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

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

### Функция 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, 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)

#### Параметры 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);
значения данных пределов ограничивают коррекцию (c версии 1.7 - приблизительно, нестрого )
subpixel - точность интерполяции пикселов (точек) при компенсации движения (по умолчанию = 2):
0 - по ближайшему исходному пикселу, без интерполяции (быстро);
1 - субпиксельная точность с билинейной интерполяцией (сглаженно);
2 - субпиксельная точность с бикубической интерполяцией (наилучше).
pixaspect - аспект (вытянутость) пиксела (по умолчанию = 1.0);
fitlast - подгонка последних кадров к оригинальным позициям (интервал, по умолчанию=0);
tzoom - время подъема адаптивного зума, секунд (по умолчанию=3.0);
info - показать ли информацию по стабилизации движения на кадре ( по умолчанию= false, нет);
inputlog - имя входного лог-файла с информацией по движению в формате Deshaker (по умолчанию - не читать)
method - используемый метод стабилизации:
0 - инерциальный (по умолчаниб);
1 - усреднения (новый с версии 1.10)

### Функция 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.4, 2.5.5, 2.5.6, 2.5.7.

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-деинтерлейс с последующим восстановлением.

#### Некоторые подходящие динамические (темпоральные) фильтры

- CTMedian (Conditional Temporal Median) by Kevin Atkinson
- и его новая моя версия переименованная в DeSpot
- STMedianFilter by Tom Barry - trbarry@trbarry.com
- FluxSmooth by Ross Thomas <ross@grinfinity.com>
- RemoveDirt by Rainer Wittmann gorw@gmx.de
- DeGrainMedian (by Fizick)

Тестируйте, чтобы пополнить список!

Для предложенного метода фильтрации с DePan (ранее с GenMotion),
такой временной фильтр должен сравнивать пиксел с предыдущим и последующим кадром,
и делать сглаживание только если разница между предыдущим и последующим мала.
Эти фильтры также могут выполнять дополнительную (локальную) компенсацию остаточного движения

### Использование DePan для изменения частоты кадров

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

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

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

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

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. Она может оценивать панорамирование, зум и вращение.

### Дополнительная информация о 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 и многих других за полезные обсуждения и доклады об ошибках.

### История версий:

- Версия 0.1, 25 Апреля 25, 2004 - первая публичная бета.
- Версия 0.2, 27 Апреля , 2004 - исправлен баг для нецелых величин Offset.
- Версия 0.3, 7 Мая, 2004 - исправлен баг с DePanStabilize входными параметрами, изменено subpixel=2 по умолчанию, добавлена оценка зума и параметр ZoomMax, компенсация зума и вращения, чтение лог файла, параметр MatchFields.
- Версия 0.4, 16 Мая, 2004 - исправлен баг с MatchFields для больших значений Offset,
  исправлен баг с позицией пиксела для проекции ближайших пикселов и билинейной интерполяции,
  изменено MatchFields=true по умолчанию, добавлен аспект пиксела, добавлена русская документация.
- Версия 0.5, 22 Мая, 2004 - исправлен баг с вращением в Depan,
  улучшена DepanStabilize: изменен метод стабилизации на инерциальный в широком диапазоне,
  добавлены параметры freqmax, dxmax, dymax, zoommax, rotmax, inputlog.
- Версия 0.6, 28 Мая 2004 - немного изменен и документирован клиент-сервер формат,
  DepanEstimate: добавлен параметр Stab, смена сцены при резких изменениях корреляции, Range может быть 0, показ корреляции, обрезка выхода.
  DepanStabilize: Freqmax переименован в Cutoff, добавлен адаптивный зум, заполнение краев смежными кадрами.
- Версия 0.7, 30 Мая 2004 - DepanEstimate: добавлено улучшение оценки зума (Improve) путем итерации .
- Версия 0.8, 6 июня 2004 - DepanInterleave: параметр Range заменен на Prev и Next.
- Версия 0.9, 13 июня 2004 - все клиенты : добавлен параметр Mirror для зеркального заполнения пустых краев.
- Версия 0.9.1, 24 августа 2004 - исправлены баги с оценкой и компенсацией зума.
- Версия 1.0, 3 сентября 2004 - добавлена опция использования внешней библиотеки FFTW (более быстрой) .
- Версия 1.1, 16 сентября, 2004 - Добавлена экспериментальная функция DepanScenes.
- Версия 1.1.1, 07 октября, 2004 - Исправлена ошибка компенсации у правых верхнего и нижнего углов,
  изменено с FFTW_MEASURE на FFTW_ESTIMATE для более короткой инициализации, без заметного изменения скорости (для окон степени 2),
  компиляция без флага /G7 (как было до версии 1.0), добавлены в документацию скриптовые FPS функции. (не публичная)
- Версия 1.1.2, 09 октября, 2004 - Задержанная загрузка fftw3.dll (теперь опциональной).
- Версия 1.1.3, 16 ноября, 2004 - Исправлена ошибка с бесконечным смещением в DepanStabilize.
- Версия 1.1.4, 15 декабря, 2004 - параметр damping в DepanStabilize теперь изменяемый (был случайно фиксирован = 0.9 во всех предыдущих версиях :-). Добавлена заметка о MVDepan в документацию.
- Версия 1.1.5, 31 декабря, 2004 - Исправлена ошибка в DepanEstimate (неверные результаты) для fftw=true с show=false и info=false
- Версия 1.2, 1 апреля 2005 - добавлен параметр fitlast для подгонки последких кадров к оригинальным позициям
- Версия 1.3, 29 апреля 2005 - добавлен параметр blur для некоторого скрытия резких отраженных деталей путем размазывания; пока блюр только горизонтальный, у левой и правой сторон кадра.
- Версия 1.4, 7 мая 2005 (обнародована 29 мая) - DePanStabilize: Улучшен режим адаптивного зума addzoom. Теперь скорость снижения адаптивного зума более медленная, чем скорость увеличения. Таким образом, уменьшаются пустые черные бордюры, и величина зума теперь более стабильна.
- Версия 1.4.1, 30 мая 2005 - DepanEstimate: исправлена ошибка с лог-файлом (символы A и B перепутаны) для BFF (все предыдущие версии). Спасибо eugvas за доклад.
- Версия 1.5, 4 июня 2005 - улучшен адаптивный зум; добавлен параметр tzoom для задания времени подъема адаптивного зума (был равен 1/cutoff).
- Версия 1.6, 5 августа 2005 - добавлена поддержка YUY2; отменен режим improved=true (был неисправен); изменено значение по умолчанию subpixel=1 для DepanInterleave как достаточное для понижения шума и более быстрое.
- Версия 1.7, 5 сентября 2005 - DePanStabilize: добавлен параметр initzoom для минимального зума;
  изменены пороги dxmax, dymax, zoommax, rotmax с жестких на мягкие с большей крутизной нелинейности.
  Изменен кэш.
- Версия 1.8, 14 марта, 2006 - DePanEstimate: установил FFTW по умолчанию если есть, FFTW_MEASURE, небольшая iSSE оптимизация
  DePanStabilize: добавлены (недокументированные :-) строковые параметры vdx, vdy, vzoom, vrot для переменных AviSynth как просил AI.
  Исправил ошибку с subpixel=1 YUY2 режимом (доступ к памяти при обновлении).
- Версия 1.8.1, 8 мая, 2006 - DePanStabilize: теперь стабилизирует и зум.
- Версия 1.8.2, 5 июня 2006 - DePanStabilize: теперь стабилизирует зум на коротком интервале;
  Исправил старую ошибку с вращением.
  DePanEstimate: dx или dy=0 теперь означают не оценивать движение вдоль этой координаты.
- Версия 1.8.3, 11 июня 2006 - DePanStabilize: теперь prev и next определяют максимальное отстояние.
- Version 1.9.0, 13 Ноября, 2006 - Выделил функцию DePanEstimate в отдельный плагин DePanEstimate.dll (под GNU GPL), удалил не-fftw код (теперь всегда fftw=true).
- Version 1.9.1, 27 Ноября, 2006 - DePanEstimate: более корректная обработка dxmax=0 или dymax=0
- DePanEstimate Version 1.9.2, 25 марта 2007 - DePanEstimate: параметр extlog для записи расширеного лог-файла с данными Trust (как просил David).
- DePan Version 1.10 beta, 8 мая 2007 - DepanStabilize: добавлен новый method усреднения,
  исправлена небольшая ошибка в интерполяции краев.

### Лицензия

Плагин DePanEstimate - это программа, распространяемая на условиях лицензии GNU GPL. Смотри gpl-rus.txt.
Плагин DePan распространяется свободно, но без всяких гарантий. Вы не можете распространять его без данной документации
Документация распространяется на условиях лицензии CreativeCommons BY-SA 3.0 license.

Прошу рассмотреть возможность финансовой поддержки, чтобы быть зарегистрированным пользователем.

### Скачивание

Download DePan Tools version 1.10.0

Download DePanEstimate version 1.9.2

Вернуться на главную страницу