MVTools

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

Авторы:Manao, Fizick(Александр Балахнин), Tsp, TSchniede
Версия: 1.11.4.5
Загрузка: http://avisynth.org.ru/
Категория: плагины разного назначения (Misc Plugins)
Требования: YV12, YUY2 цветовые форматы

Содержание:

I) О MVTools

MVTools плагин для AviSynth 2.5 - это коллекция функций для оценки и компенсации движения объектов в видео клипах. Компенсация движения может быть использована для сильного временного понижения шума, продвинутых преобразований частоты кадров, реставрации изображений и других задач.

Плагин содержит серверную функцию оценки движения MVAnalyse (сервер) для нахождения векторов движения и несколько клиентских функций компенсации движения (MVCompensate, MVMask и других), которые используют эти векторы.

Плагин использует метод сличения блоков (block-matching) для оценки движения (подобные методы используются в MPEG2, MPEG4 и т.д). На стадии анализа плагин разделяет кадры на малые блоки и пробует найти для каждого блока в текущем кадре наиболее подобный (соответствующий) блок во втором кадре (предыдущем или последующем). Относительное смещение этих блоков и есть вектор движения. Основной мерой подобия блоков является сумма абсолютных разностей (SAD) всех пикселов этих двух сравниваемых блоков. SAD это величина, показывающая, насколько хороша оценка движения.

Выходом функции MVAnalyse является специальный клип с информацией о векторах движения в некотором формате.

На стадии компенсации клиентские функции плагина читают вектора движения и используют их, чтобы передвинуть блоки и сформировать кадр с компенсированным движением (или реализуют какую-либо другую функцию полной или частичной компенсации или интерполяции). Каждый объект (блок) в этом (полностью) скомпенсированном кадре помещен в ту же позицию, как этот объект в текущем кадре. Таким образом, мы можем (например) использовать сильное временное понижение шума даже для достаточно быстро движущихся объектов без производства раздражающих артефактов и призраков (особенности и края объектов совпадают, если компенсация совершенна). Плагин может создать компенсированные соседние кадры для каждого текущего кадра и снизить его шум с помощью внутренней функции. Альтернативно, вы можете использовать использовать компенсированные кадры, чтобы создать клип с их чередованием, понизить его шум с использованием любого внешнего фильтра, и выбрать для выхода центральные очищенные кадры (смотри примеры).

Конечно, оценка компенсация движения не идеальна и не точна. В некоторых сложных случаях (видео с затуханием, сверх-быстрым движением, периодическими структурами) оценка движения может быть полностью неверна, и компенсированный (особенно интерполированный) кадр будет блочным и (или) уродливым. Трудности также представляют заслонение одного объекта другим или наоборот, открытие. Сложные AviSynth скрипты со многими функциями компенсации движения могут съесть огромное количество памяти и привести к очень медленной обработке. Это не простой, а достаточно сложный плагин. Используйте его только для подходящих случаев, и попытайтесь настроить его параметры. Есть много обсуждений по поводу использования компенсации движения на (англоязычном) форуме doom9 по AviSynth. В частности смотрите старую ветку по MVTools, ветку по true motion, новую ветку по MVTools и несколько других. Попробуйте почитать сообщения как дополнения к данной документации и спрашивайте там поддержку. Если вы действительно заинтересовались вопросами оценки и компенсации движения, вы легко найдете многочисленные научные публикации (используйте WWW поиск).

Замечания. Данный плагин еще в стадии разработки. Текущая версия имеет некоторые ограничения. Поддерживается только прогрессивное видео цветового формата YV12, YUY2. Используйте преобразование цветовых форматов и попробуйте использовать (разумный) BOB-деинтерлейс для чересстрочного видео (может также работать разделение на поля SeparateFields с или без SelectEven/SelectOdd). Некоторые сложные скрипты (MVBOB, MCBOB) используют MVTools для деинтерлейса с компенсацией движения. Альтернативно вы можете попробовать использовать плагин Motion от mg262.

II)Описания функций

Общие параметры

Фильтры, использующие вектора движения (MV), имеют ряд общих параметров. Это пороги детектирования сцен и флаги использования mmx/isse. Кроме того фильтры используют один или несколько потоков векторов.

int thSCD1: порог определения, изменился ли блок в текущем кадре относительно предыдущего. Если блок изменился, это значит, что предварительный прогноз движения для него в целом некорректен. Это происходит, например, при смене сцен. То есть это один из порогов, используемых для отладки механизма детектирования смены сцен. Его увеличение уменьшит количество блоков, определяемых как измененные. Это может быть полезно для шумного или мерцающего видео. Порог сравнивается со значением SAD (Sum of Absolute Differences - суммой абсолютных различий, значение погрешности, говорящее о степени несоответствия рассчитанного прогноза движения). Для строго идентичных блоков мы имеем SAD=0. Но реальные блоки всегда отличаются из-за сложного движения объектов (приближение, вращение, деформация), дискретности отсчета пикселов, и шума. Предположим мы имеем два сравниваемых блока 8х8 с каждым из пикселов отличающихся на 5. В этом случае SAD будет 8x8x5 = 320 (блок будет зарегистрирован как неизменившийся при thSCD1=400). Если используются блоки 4x4, величина SAD будет 320/4. Если используются блоки 16x16, величина SAD будет 320/4. На самом деле этот параметр масштабируется внутренне, и Вы должны всегда использовать величину, приведенную к размерам блока 8x8. По умолчанию задано 400 (с версии 1.4.1).

int thSCD2: порог, задающий количество блоков, которые должны измениться, чтобы принять решение о смене сцен. Его диапазон 0...255, 0 соответствует 0 %, 255 - 100 %. По умолчанию задано 130 (что соответствует 51 %).

bool isse : флаг использования ISSE и MMX оптимизации. Установка в false позволяет отключить ISSE и MMX оптимизацию для отладки. По умолчанию: true. Если Ваш процессор не поддерживает isse оптимизацию, она все равно будет отключена (и активировать ее не удастся)

MVAnalyse

MVAnalyse (clip, int "blksize", int "blksizeV", int "pel", int "level", int "search", int "searchparam", int "pelsearch", bool "isb", int "lambda", bool "chroma", int "delta", bool "truemotion", int "lsad", int "pnew", int "plevel", bool "global", int "pzero" int "overlap", int "overlapV", string "outfile", int "sharp", int "rfilter", clip "clip2x", int "dct", int "divide", bool "mc", int "idx", int "sadx264")

Оценивает движения методом сличения блоков и производит специальный выходной клип с данными по векторам движения (используемыми другими программами).
Реализованы некоторые иерархические многоуровневые методы поиска (от грубого масштаба изображения к тонкому). Функция использует нулевой вектор и векторы соседних блоков как предикторы (начальные приближения) для текущего блока. Сначала оценивается разница (SAD) для предикторов, затем пробный вектор изменяется на некоторую величину в некотором направлении, оценивается SAD, и так далее. Принятый новый вектор для блока - это вектор с минимальной разностью (SAD) (с некоторой поправкой-штрафом для согласованности движения)

blksize: Размер блока (горизонтальный). Возможны только значения 4, 8, 16, 32 (по умолчанию 8). БОльшие блоки менее чувствительны к шумам, и обрабатываются быстрее, но более грубы.

blksizeV : вертикальный размер блока. По умолчанию равен горизонтальному. Дополнительные варианты: 4 для blksize=8, 2 и 8 для blksize=16, 16 для blksize=32.

pel : Это точность прогнозирования движения. 1 означает точность до пиксела, 2 - до полу-пиксела, 4 - до четверти пиксела (более точное, но медленнее и не всегда лучше из-за большого шага масштаба между уровнями). По умолчанию: 2 с версии 1.4.10.

level: Это количество грубых уровней, НЕ используемых при иерархическом анализе во время нахождения векторов движения. Чем оно меньше, тем обычно лучше (находятся вектора любой длины). Переменная оставлена главным образом для учебных (тестовых) целей. Иногда level полезна для предотвращения очень длинных (ложных) векторов (компьютерной графики и т.п.). По умолчанию: 0.

search, searchparam, pelsearch : search определяет тип поиска, а searchparam - дополнительный параметр (шаг, радиус) поиска, а pelsearch - этот параметр для самого тонкого (pel) уровня:

isb : позволяет выбрать прямое направление поиска (от предыдущего к текущему кадру) для isb=false либо обратное (от последующего к текущему кадру) для isb=true (это реализовано и названо именно таким образом, не переспрашивайте :-). По умолчанию isb =false.

chroma : установка в true позволяет учитывать и цветовую информацию при оценке движения (false - толькоя яркостную). По умолчанию true.

delta : устанавливает кадровый интервал между указанным и текущим кадром. По умолчанию он равен 1, что означает, что вектора движения ищутся между текущим и предыдущим (или следующим) кадром. Установка в 2 позволит искать mvs между кадром n и n-2 или n+2 (в зависимости от значения isb).

Существуют дополнительные параметры, которые устанавливают согласованность векторов движения для оценки так называемого истинного движения (true motion). Некоторые найденные поиском блоки другого кадра могут быть наиболее подобны образцовым блокам текущего блока по критерию интенсивности (SAD), но не отвечать истинному движению объекта. Например, они могут принадлежать другому подобному объекту в другом углу кадра, или относиться к некоторой периодической структуре. Параметры "истинного движения" (true motion) пытаются поддерживать поле движения согласованным, слаженным, вместо некоторого случайного распределения векторов. Это особенно важно для частичной компенсации и интерполяции движения. Некоторые параметры являются экспериментальными и могут быль удалены (заменены) из последующих версий после тестирования. Пожалуйста, сообщайте ваши заключения.

truemotion это предварительно созданный набор значений этих параметров. Он позволяет легко переключать значения по умолчанию сразу всех параметров "истинного движения". Установите его равным true для поиска истинного движения (высокой согласованности векторов), Установите его равным false для поиска векторов движения с наилучшей SAD. По умолчанию - true c версии v1.4.10. В любом случае вы можете настроить каждый параметр индивидуально.

lambda : устанавливает согласованность (слаженность, coherence) поля векторов. Чем выше, тем больше согласованность. Однако, если задать его слишком высоким, некоторые 'правильные' вектора движения могут быть пропущены. Величины около 400 - 2000 (для размера блока 8х8) настоятельно рекомендуются. Внутренне это коэффициент для штрафа к SAD от квадратичной разности вектора от предиктора (соседей), масштабированный на 256.
По умолчанию 0 для truemotion=false и 1000*blksize*blksizeV/64 для truemotion=true.

lsad: порог SAD для использования lambda. Локальная lambda уменьшается (плавно с версии 1.10.2) если величина SAD предиктора вектора (сформированного из соседей) больше чем порог. Это предотвращает использование плохих предикторов, но снижает согласованность движения. Величины выше 1000 (для размера блока 8) рекомендуются для истинного движения.
По умолчанию 400*blksize*blksizeV/64 для truemotion=false и 1200*blksize*blksizeV/64 для truemotion=true.

pnew: относительный штраф (в масштабе 256) к погрешности (SAD) для нового вектора-кандидата. Пробный вектор будет принят как новый вектор, только если его SAD со штрафом (SAD + SAD*pnew/256) будет лучше, чем погрешность (SAD) предиктора. Величины около 50-100 (для размера блока 8х8) рекомендуются для истинного движения. Это предотвращает замену вполне хороших предикторов на новый вектор с немного лучшей SAD, но другой длиной и направлением.
По умолчанию 0 для truemotion=false и 50 для truemotion=true.

plevel: режим масштабирования штрафного коэффициента lambda от уровня. Величина =0 - без масштабирования, 1 - линейная, 2 - квадратичная зависимость от размера иерархического уровня. Заметьте, что длина вектора меньше на более низком уровне.
По умолчанию 0 для truemotion=false и 1 для truemotion=true.

global: оценить глобальное движение (на каждом уровне) и использовать его как дополнительный предиктор. Оценивается только панорамное смещение (ни зум, ни вращение). Величина = false означает отменить, true - разрешить. По умолчанию false для truemotion=false и true для truemotion=true.

pzero: относительный штраф (в масштабе 256) к погрешности (SAD) для нулевого (и глобального) вектора. Это предотвращает замену вполне хороших предикторов на нулевой вектор с немного лучшей SAD (lambda не используется для нулевого и глобального векторов). По умолчанию равен pnew с версии 1.11.

overlap: величина перекрытия блоков (горизонтальная). Должна быть четной и меньше размера блока (до blksize/2 для MVCompensate). Шаг между блоками для оценки движения равен (blksize-overlap). N блоков покрывают размер ((blksize-overlap)*N + overlap) на кадре. Попробуйте значения перекрытия от blksize/4 до blksize/2. Чем больше перекрытие, тем больше число блоков, и меньше скорость обработки. Величина по умолчанию 0.
Функции, поддерживающие режим перекрытия: MVFlow, MVFlowInter, MVFlowFps (не MVFlowFps2), MVShow, MVMask, MVCompensate, MVDeGrain1, MVDeGrain2, MVDeGrain3.

overlapV: вертикальная величина перекрытия блоков. По умолчанию равна горизонтальной. Должна быть четной для YV12 и меньше размера блока.

outfile: имя файла для вывода данных по векторам движения. Эти данные могут быть использованы некоторыми внешними программами или может быть следующими версиями MVTools для кодирования второго прохода и т.п.
Производимый двоичный файл имеет заголовок (структура MVAnalysisData, смотри исходный код MVInterface.h), и последовательность данных:
номер кадра, данные вектора (Vx, Vy, SAD) каждого блока, номер следующего пригодного кадра, данные векторов этого кадра, и т.д.
По умолчанию - пустая строка, не записывать файл.

sharp: метод субпиксельной интерполяции для pel=2,4.
Используйте 0 для мягкой (билинейной) интерполяции, 1 для бикубической (по 4 точкам, Catmull-Rom), 2 для резкой типа Wiener (по 6 точкам, подобно Lanczos).
По умолчанию 2.

rfilter: метод сокращения иерархических уровней. Используйте 0 для простого суммирования 4 пикселов (усреднение подобно BilinearResize, старый метод), испольуйте 1 для фильтра 1/4, 1/2, 1/4 (подобно ReduceBy2) для более гладкой оценки движения.
По умолчанию 1 (с версии 1.11.0.2).

pelclip: увеличенный исходный клип для использования вместо внутренней субпиксельной интерполяции (для pel>1).
Пикселы в строках и столбцах кратных pel (0,2,4,... для pel=2) должны быть оригинальными пикселами источника, другие пикселы должны быть интерполированы.
Пример для pel=2: LanczosResize(width*2,height*2,src_left=0.25, src_top=0.25)
(Недавнее замечание: это справедливо для яркостного канала, но не строго соответствует позицмям пикселов цветности внутреней интерполяции в MVTools. Тем не мене, вектора и компенсация движения вполне подобны для обычныз клипов, Строго та же цветность была бы при src_left=0.5 для YUY2 и дополнительно src_top=0.5 для YV12).
Другой полезный пример - интерполятор EEDI2 с направленостью вдоль краев.
Для корректных результатов Вы должны использовать (причем тот же) клип pelclip во всей цепочке MVTools функций, использующих тот же исходный клип (и idx).
По умолчанию не определен.

dct: использование DCT (частотный спектр) блоков для расчета отличия блоков (SAD). Это может в том числе улучшить оценку векторов движения при мерцаниях и затуханиях яркости.
0 - обычные пространственные блоки, не использовать DCT;
1 - использовать DCT блоков вместо пространственной информации (медленно для 8x8, и очень медленно для других размеров);
2 - смешанный режим с весами пространственной и DCT информации, зависящими от разности средней яркости кадров;
3 - адаптивное поблочное переключение от пространственного к равно смешанному (экспериментальный, чуть быстрее).
4 - адаптивное поблочное переключение от пространственного к смешанному с большим весом DCT (экспериментальный, чуть быстрее).
добавленные в 1.9.5.3 режимы: (требуют sadx264 0-7, используют быструю SATD функцию, только яркость!)
5 - SATD вместо SAD для яркости
6 - аналогично 2, но используя SATD
7 - аналогично 3, но используя SATD
8 - аналогично 4, но используя SATD
9 - подобно 2, используя SATD и вес диапазон от только SAD до равных SAD & SATD
10 - подобно 3/4, использовать SATD вес на SAD, только на сильных изменения яркости
По умолчанию = 0.

divide: пост-обработка векторов движения путем деления каждого блока на 4 одинаковых меньших подблока.
0 - не делить;
1 - делить блоки и присвоить оригинальный вектор всем 4 подблокам;
2 - делить блоки и присвоить подблокам медианые (с 2 соседними) вектора;
По умолчанию = 0. Размеры блоков и перекрытия должны быть выбраны подходящими после внутреннего деления.

mc: дополнительно хранить скомпенсированные по движению кадры в клипе векторов (используется в MVDenoise). По умолчанию false (не хранить для экономии памяти) с версии v1.11.4.

idx : индекс клипа. Он позволяет повторно внутренне использовать (разделить) несколькими вызовами данного фильтра (или другими функциями) вычисленные по кадрам клипа многоуровневые данные для более быстой обработки и экономии памяти. Это особенно полезно для pel=2 для избежания повторного расчета интерполяции пикселов при выполнении поиска вперед и назад для того же клипа. Если вы используете idx, то должны задавать только положительные числа, и вы должны использовать то же значение только для фильтров, работающих с тем же клипом (иначе анализ не будет работать правильно). По умолчанию, задается уникальное отрицательное число для каждого вызова фильтра (который при этом создает собственные многоуровневые данные).

sadx264: использовать SAD функции из кодека x264 если они доступлы для данного размера блока
0 - (по умолчанию) автоматически детектировать процессор и выбрать оптимальный алгоритм SAD.
1 - использовать MMX 16x16, 16x8, 8x8, 8x4, 4x4 (8x16, 4x8 используются только для цветности)
2 - использовать MMX 16x16, 16x8, 8x8, 8x4 (8x16, используются только для цветности) с выравниванием блоков до 32 байт
3 - использовать MMX 16x16, 16x8, 8x8, 8x4 (8x16, только цветность) с выравниванием блоков до 64 байт, лучший для Pentium M
4 - использовать SSE2 16x16, 16x8 (без специального выравнивания)
5 - использовать SSE2 16x16, 16x8, выравнивание блоков до 64 байт (хорошо для Core)
6 - использовать SSE3 16x16, 16x8 (кажется работает быстрее только на Pentium 4E или Core1)
7 - использовать SSSES3 16x16, 16x8, выровненные до 64 байта блоки (хорошо на Core2)
Режимы 8-12 предназначены для отладки - используйте dct >4 вместо них.
Использование sadx264 > 7 означает: использовать выбранный вместо SAD для любой яркостной/цветностной SAD, где возможно!
for SAD / SATD mix and luma only use dct
8 - использовать SSD mmx, работает аналогично 1
9 - использовать SATD mmx, работает аналогично 1
10 - использовать SATD SSE2, работает аналогично 2
11 - использовать SATD SSSE3, работает аналогично 2
12 - использовать SATD SSSE3 с PHADD для 8xY, работает аналогично 2
По умолчанию 0, используйте -1 или >=13, чтобы использовать старый v1.9.4 код вместо функций SAD из x264

Попробуйте использовать функцию MVShowдля контроля оцененного поля движения и настройки параметров.

Замечание: MVAnalyse (если Pel=2) учитывает признак разделенного на поля видео (послеr SeparateFields) и автоматически производит коррекцию векторов с учетом вертикального смещения полей разной четности. Попробуйте использовать AssumeFrameBased если вам это не нужно.

MVCompensate

MVCompensate (clip, clip "vectors", bool "scbehavior", int "mode", int "thSAD", bool "fields", clip "pelclip", int "idx")

Выполняет полную компенсацию движения кадра. Это означает, что блоки указываемые векторами движения в предыдущем кадре (или последующем, в зависимости от установок MVAnalyse) будут двигаться вдоль векторов с целью достичь своих мест в текущем кадре.

scbehavior (по умолчанию true), определяет, какой кадр будет сохранен при смене сцен. Если true, кадр оставляется неизменным. Иначе указанный кадр копируется в текущий.

mode может быть 0 , 1 (по умолчанию). Mode=0 ранее означала использование компенсации, созданной во время поиска векторов. Сейчас сведена к mode=1. Mode=1 означает перерасчет этой компенсации по векторам (так как возможно вы хотите использовать вектора к другому клипу чем тот, в котором выполнялся поиск). Режим Mode=2 теперь отменен.

thSAD - это порог SAD для безопасной (фиктивной) компенсации. Если SAD блока выше чем thSAD, то плок плохой, и мы используем блок из источника вместо компенсированного блока. По умолчанию 10000 (практически отменена).

fields: если true и pel=2, добавляет соответствующий вертикальный сдвиг (на полпиксела) полей основанного на полях видео. Попробуйте использовать это для деинтерлейса (не для понижения шума)
По умолчанию false.

pelclip: увеличенный исходный клип для использования вместо внутренней субпиксельной интерполяции (для pel=2) (как в MVAnalyse).
По умолчанию не определен.

idx работает аналогично idx в MVAnalyse.

Обработка перекрывающихся блоков реализована как оконное суммирование блоков (аналогично FFT3DFilter, величина overlap до blksize/2) для снижения артефактов блочности.

MVDenoise

MVDenoise (clip, clip mvs [,...], bool "Y", bool "U", bool "V", int "thT", int "thSAD", int "thMV")

Выполняет базовое временнОе шумоподавление с компенсацией движения из нескольких клипов векторов mvs. Для опорных кадров выполняется компенсация движения и затем они сливаются с текущим кадром. Два порога используются для предотвращения артефактов.

Первый порог, thT, определяет, надо ли пиксель, взятый из предыдущего или следующего кадра, включать в процесс суммирования. Если этот пиксель отличается более чем на thT от пикселя текущего кадра, то он не используется.

Второй, thSAD, определяет, будет ли блок изменен или нет (по тем же правилам, что и thSCD1). Если блок изменился, пиксель не сливается с соответствующими из предыдущего и последующего кадров.

thMV это длина вектора, выше которой блок не используется для шумопонижения.

Наконец, Y, U и V говорят, какие плоскости должны быть обработаны шумоподавителем.

По умолчанию: Y, U и V установлены в true (да), thT = 10, thSAD = 200 и thMV = 30.

Это устаревшая функция. Обработка перекрывающихся блоков реализована как простое последовательное покрытие блоками слева направо, сверху вниз. Данная функция использует скомпенсированные по движению кадры, хранящиеся в клипах векторов.

MVMask

MVMask (clip, clip "vectors", int "ml", float "gamma", int "kind", int "Ysc")

Создает клип масок на основе данных векторов движения. Маска определяется данными по блокам, но интерполируется до полного размера кадра. Маска создается как в яркостном канале, так и в плоскостях цветности. Величины в маске могут быть от 0 (мин) до 255 (макс).

Параметр kind определяет разновидность маски.

Режим kind=0 создает маску движения исходя из длины векторов движения. Функция строит маску лучше, чем MotionMask ( MaskTools ), так как вектора движения намного более достоверны, чем алгоритм в MotionMask. Значение маски 0 означает отсутствие движения вообще (длина вектора нулевая). Чем больше длина вектора, тем больше величина маски (насыщается до 255), масштаб определяется параметром ml.

kind=1 позволяет построить маску из величин SAD (суммы абсолютных разностей) вместо длин векторов. Это может быть полезно, чтобы выявить проблемные области с плохой оценкой движения. (Используется внутренний коэффициент blocksize*blocksize/4 для нормализации масштаба ml.)

kind=2 позволяет построить маску окклюзий (разрывности, заграждения, occlusion) (плохих блоков из-за разрыва, растяжения). В настоящей версии используется некоторая нормализованная сумма положительных разностей движения блоков. Она может масштабироваться ml.

kind=3 позволяет построить маску из величин горизонтальной составляющей векторов движения в единицах pel, плюс 128. Масштабные коэффициенты не используются.

kind=4 позволяет построить маску из величин вертикальной составляющей векторов движения в единицах pel, плюс 128. Масштабные коэффициенты не используются.

kind=5 - цветная карта движения как x,y компоненты векторов, показанные на цветовых плоскостях U, V (в единицах pel, плюс 128, масштабные коэффициенты не используются).

gamma используется для определения показателя степени зависимости выхода от входа. gamma = 1.0 подразумевает линейную зависимость, а gamma = 2.0 дает квадратичную. И наконец, Ysc есть величина, принимаемая маской при смене сцены.

По умолчанию: kind=0, ml = 100, gamma = 1.0, и Ysc = 0.

MVSCDetection

MVSCDetection (clip, clip "vectors", int "Ysc")

Создает клип маски смены сцены на основе данных векторов движения. Маска создается для каналов яркости и цветоразности. Выход без смены сцены равен 0.

Ysc - это величина, принимаемая маской при смене сцены, по умолчанию 255.

MVShow

MVShow (clip, clip "vectors", int "scale", int "sil", int "tol', bool "showsad")

Показывает вектора движения. Параметр scale позволяет увеличить вектора движения, например для увеличения точности (когда pel > 1 и scale = 1, невозможно увидеть изменения менее чем на 1 пиксель). sil позволяет увидеть различные уровни анализа (когда для поиска векторов движения задан иерархический анализ и интересно увидеть что произойдет при более высоких уровнях). tol - порог допуска (толерантности). Если искажения, вызванные вектором движения больше tol, то вектор не показывается. Наконец, showsad позволяет показать среднее значение SAD картинки после компенсации.

По умолчанию: scale = 1, sil = 0, tol = 20000 и showsad = false (что обеспечивает показ всех векторов).

MVChangeCompensate

MVChangeCompensate (clip vectors, clip)

Позволяет изменить компенсированные блоки, хранимые в потоке векторов движения vectors.

MVIncrease

MVIncrease (clip, clip "vectors", int "horizontal", int "vertical", int "idx")

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

horizontal горизонтальное соотношение между шириной оригинального и уменьшенного клипа.

vertical вертикальное соотношение между высотой оригинального и уменьшенного клипа.

idx работает так же, как и в MVAnalyse

MVDepan

MVDepan (clip, clip "vectors", bool "zoom", bool "rot", float "pixaspect", float "error", bool "info", string "log", float "wrong", float "zerow", int "range")

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

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

Отвергаемые блоки: 1) вблизи границ кадра; 2) с большим SAD (по параметру thSCD1); 3) с движением, отличающимся от соседей и глобального.

Параметры zoom и rot включают оценку зума и вращения, pixaspect это аспект пиксела (1.094 для стандартного PAL, 0.911 для стандартного NTSC), error это максимум отличия от среднего движения.

Оцениваемое глобальное движение кадра выключается в нулевое для больших ошибок движения error или на смене сцены (по параметрам thSCD1, thSCD2).

Параметр info позволяет вывести информацию по глобальному движению для отладки.

Параметр log позволяет задать имя лог-файла для вывода значений в формате DeShaker, DePan.

wrong определяет предел для отброса блоков очень отличных от соседей.

zerow определяет вес нулеых вектров движения (для уменьшения их влияния).

range - число предыдущих (и также последующих) кадров (полей) соседних с запрошенным кадром, для которых оценивается движение.

Значения по умолчанию: zoom = true, rot = true, pixaspect = 1.0, error = 15.0, info = false, wrong=10, zerow=0.05, range=0.

Для оценки глобального движения чересстрочного видео, вы должны разделить поля (как для MVAnalyse, так и MVDepan).

MVFlow

MVFlow (clip, clip "vectors", float "time", int "mode", bool "fields", clip "pelclip", int "idx")

Делает компенсацию движения кадра не по блокам (как MVCompensation), а по пикселам. (Flow - течение). Вектор движения каждого пиксела вычисляется путем билинейной интерполяции векторов движения текущего и соседних блока (в соответствии с положением пиксела). Это означает, что пикселы, указываемые вектором в опорном кадре будут двигаться (течь) вдоль вектора, чтобы достичь их мест в текущем кадре. Данный метод компенсации движения течением не производит блочных артефактов, и хорош для понижения шума, но иногда может создать очень странные деформированные картины :). Оценка истинного движения настоятельно рекомендуется для этой функции. Компенсация движения может быть полной или частичной (в промежуточное время).
Ограничение: вектора с компонентами выше 127 будут сброшены к нулевой длине.

time: процент компенсации движения (по умолчанию=100.0, полная компенсация), определяет временной момент между опорным и текущим кадром.

mode: режим может быть или 0 (по умолчанию), или 1.
mode=0 - поднести пикселы к каждому месту целевого кадра. Это основной рабочий режим.
mode=1 - сдвинуть пикселы от каждого места источника (опорного). Это отладочный (учебный) режим с некоторыми пустыми местами (с нулевой интенсивностью). Он может быть использован для генерации маски окклюзий.

fields: если true и pel=2, добавляет соответствующий вертикальный сдвиг (на полпиксела) полей основанного на полях видео. Попробуйте использовать это для деинтерлейса (не для понижения шума)
По умолчанию false.

pelclip: увеличенный исходный клип для использования вместо внутренней субпиксельной интерполяции (для pel=2) (как в MVAnalyse).
По умолчанию не определен.

idx (может) работать как указано для idx в MVAnalyse.

MVFlowInter

MVFlowInter (clip, clip "mvbw", clip "mvfw", float "time", float "ml", clip "pelclip", int "idx")

Функция интерполяции движения. Это не то же самое (но подобное) функции MVInterpolate более старых версий MVTools. Она использует обратные "mvbw" и прямые "mvfw" вектора движения, чтобы создать изображение в некоторый промежуточный момент времени между текущим и следующим (на delta) кадром. Она использует по-пиксельную компенсацию движения (методом MVFlow) из обоих кадров. Используются внутренние прямая и обратная маски окклюзий - разрывности (методом MVMask kind=2) и временные взвешивающие факторы, чтобы произвести выходное изображение с минимальными артефактами. Оценка истинного движения настоятельно рекомендуется для этой функции.

time: положение интерполяционного момента времени между кадрами (в процентах, по умолчанию=50.0, посредине)

ml: масштабный параметр маски. Меньшие величины соответствуют более сильной маске окклюзий (как в функции MVMask, используйте ее для настройки и отладки). По умолчанию=100.

pelclip: увеличенный исходный клип для использования вместо внутренней субпиксельной интерполяции (для pel=2) (как в MVAnalyse).
По умолчанию не определен.

idx (может) работать как указано для idx в MVAnalyse.

MVFlowFps

MVFlowFps (clip, clip "mvbw", clip "mvfw", int "num", int "den", int "mask", float "ml", clip "pelclip", int "idx")

Будет изменять частоту кадров (fps) клипа (и число кадров). Функция может быть использована для преобразования частоты, эффектов замедления движения и т.п. Она использует обратные "mvbw" и прямые "mvfw" вектора движения чтобы создать интерполированные изображения в некоторые промежуточные моменты времени между кадрами. Функция использует по-пиксельный метод компенсации движения (как MVFlow, MVFlowInter). Используются внутренние прямая и обратная маски окклюзий - разрывности (методом MVMask kind=2) и временные взвешивающие факторы, чтобы произвести выходное изображение с минимальными артефактами. Оценка истинного движения настоятельно рекомендуется для этой функции.

num: fps числитель выходной частоты кадров. По умолчанию = 25.

den: fps знаменатель (по умолчанию = 1). Результирующая частота кадров fps = num/den. В частности для удвоенной NTSC fps=2*29.97 используйте num=60000, den=1001, а для удвоенной NTSC FILM fps=2*23.976 используйте num=48000, den=1001.

Причем если num или den равны нулю, подразумевается удвоенная частота входного клипа (с версии 1.8).

mask: режим обработки:
mask=0 для простых прямой и обратной масок разрывности (использовался в версиях до 1.4.x, самый быстрый);
mask=1 для подобных масок с дополнительным переходом к статическим нулевым векторам в областях рахрывности (подобный v1.5.x);
mask=2 для использования дополнительных векторов из смежных кадров для снижения ореолов движущихся объектов в областях разрывности (v1.8, медленный). ПО умолчанию =2.

ml: масштабный параметр маски. Большие величины соответствуют более слабой маске разрывности (как в функции MVMask, используйте ее для настройки и отладки). По умолчанию=100.

pelclip: увеличенный исходный клип для использования вместо внутренней субпиксельной интерполяции (для pel=2) (как в MVAnalyse).
По умолчанию не определен.

idx (может) работать как указано для idx в MVAnalyse.

MVFlowFps2

MVFlowFps2 (clip, clip "mvbw", clip "mvfw", clip "mvbw2", clip "mvfw2", int "num", int "den", int "mask", float "ml", clip "pelclip", int "idx", int "idx2")

Будет изменять частоту кадров (fps) клипа (и число кадров) подобно MVFlowFps, но с немного лучшим качеством (и более медленной обработкой), за счет внешнего перекрытия блоков.
(Замечание: MVFlowFps теперь имеет более эффективный режим внутреннего перекрытия блоков, и MVFlowFps2 является устаревшей. MVFlowFps2 не работает корректно с overlap в MVAnalyse.)
В дополнении к обратным "mvbw" и прямым "mvfw" векторам движения оригинального исходного клипа, функция MVFlowFps2 использует обратные "mvbw2" и прямые "mvfw2" вектора движения второго (модифицированного) клипа-источника. Второй клип должен быть сделан из оригинального исходного клипа путем обрезки (то есть диагонального сдвига) на половину размера блока. Это может быть сделано командой Crop(a,a,-b,-b), где a=b=4 должны использоваться для blksize=8, a=b=8 для blksize=16, и a=2, b=6 для blksize=4 (смотри пример). Границы блоков будут на разных частях объектов. MVFlowFps2 обращает сдвиг внутренне и усредняет вектора движения двух источников для снижения ошибок оценки движения. Функция использует по-пиксельный метод компенсации движения (как MVFlow, MVFlowInter). Используются внутренние прямая и обратная маски окклюзий - разрывности (методом MVMask kind=2) и временные взвешивающие факторы, чтобы произвести выходное изображение с минимальными артефактами. Оценка истинного движения настоятельно рекомендуется для этой функции.

num: fps числитель выходной частоты кадров. По умолчанию=0. Причем если num или den равны нулю, подразумевается удвоенная частота входного клипа.

den: fps знаменатель (по умолчанию=0). Результирующая частота кадров fps = num/den. В частности для удвоенной NTSC fps=2*29.97 используйте num=60000, den=1001, а для удвоенной NTSC FILM fps=2*23.976 используйте num=48000, den=1001.

mask: режим обработки:
mask=0 для простых прямой и обратной масок разрывности (использовался в версиях до 1.4.x, самый быстрый);
mask=1 для подобных масок с дополнительным переходом к статическим нулевым векторам в областях разрывности (подобный v1.5.x);
mask=2 для использования дополнительных векторов из смежных кадров для снижения ореолов движущихся объектов в областях разрывности (v1.8, медленный). ПО умолчанию =2.

ml: масштабный параметр маски. Большие величины соответствуют более слабой маске окклюзий (как в функции MVMask, используйте ее для настройки и отладки). По умолчанию=100.

pelclip: увеличенный исходный клип для использования вместо внутренней субпиксельной интерполяции (для pel=2) (как в MVAnalyse).
По умолчанию не определен.

idx (может) работать как указано для idx в MVAnalyse.

idx2 это индекс MVAnalyse второго (смещенного) клипа clip (не должен совпадать с первым idx).

MVBlockFps

MVBlockFps (clip, clip "mvbw", clip "mvfw", int "num", int "den", int "mode", float "thres", int "idx")

Данная функция использует основанную на блоках частичную компенсацию блоков для изменения частоты кадров (fps) клипа (и число кадров). Она использует обратные "mvbw" и прямые "mvfw" вектора движения чтобы создать интерполированные изображения в некоторые промежуточные моменты времени между кадрами. Некоторые внутренние прямые и обратные маски и временные взвешивающие факторы используются для производства выходного изображения. (алгоритм основан на функции MVInter старой версии MVTools 1.9.12.) Это быстрее, чем MVFlowFps, но может дать блочность и другие артефакты. Оценка истинного движения настоятельно рекомендуется для этой функции.

num: fps числитель выходной частоты кадров. По умолчанию = 25.

den: fps знаменатель (по умолчанию = 1). Результирующая частота кадров fps = num/den. В частности для удвоенной NTSC fps=2*29.97 используйте num=60000, den=1001, а для удвоенной NTSC FILM fps=2*23.976 используйте num=48000, den=1001.

Причем если num или den равны нулю, подразумевается удвоенная частота входного клипа.

mode: режим обработки:
0 - среднее от приведенных прямой и обратной частичных компенсаций движения (быстрый, по умолчанию).
1 - статическая медиана.
2 - динамическая медиана.
3 - взвешенная по времени комбинация принесенных прямых блоков, маскированных смещенными обратными, и принесенных обратных, маскированных смещенными прямыми.
4 - режим 3, смешанный с простым статическим усреднением по маске разрывности смещенных блоков.
5 - маска разрывности (для отладки).

thres: порог количества разрывов на блок, для бинаризации маски. По умолчнию=0, что внутренне = blksize*blksizeV/4.

idx (может) работать как указано для idx в MVAnalyse для увеличения скорости.

MVFlowBlur

MVFlowBlur (clip, clip "mvbw", clip "mvfw", float "blur", int "prec", clip "pelclip", int "idx")

Экспериментальная простая функция размытия движения (motion blur). Она может быть использована для создания эффекта Фильма (чтобы имитировать конечное время открытия затвора кинокамеры). Она использует обратные "mvbw" и прямые "mvfw" вектора движения для создания и наложения многих копий частично компенсированных пикселов в промежуточные моменты времени в некотором интервале размытия вокруг текущего кадра. Используется по-пиксельная компенсация (метод MVFlow). Оценка истинного движения настоятельно рекомендуется для этой функции.

blur: временной интервал размытия между кадрами, время открытия затвора (в процентах, по умолчанию=50.0)

prec: точность размытия в единицах пикселов. Максимальный шаг между компенсированными размытыми пикселами. По умолчанию =1 (наиболее точно).

pelclip: увеличенный исходный клип для использования вместо внутренней субпиксельной интерполяции (для pel=2) (как в MVAnalyse).
По умолчанию не определен.

idx (может) работать как указано для idx в MVAnalyse.

MVDeGrain1, MVDeGrain2 и MVDeGrain3

MVDeGrain1 (clip, clip "mvbw", clip "mvfw", int "thSAD", int "thSADC", int "plane", int "limit", clip "pelclip", int "idx")

MVDeGrain2 (clip, clip "mvbw", clip "mvfw", clip "mvbw2", clip "mvfw2", int "thSAD", int "thSADC", int "plane", int "limit", clip "pelclip", int "idx")

MVDeGrain3 (clip, clip "mvbw", clip "mvfw", clip "mvbw2", clip "mvfw2", clip "mvbw3", clip "mvfw3",int "thSAD", int "thSADC", int "plane", int "limit", clip "pelclip", int "idx")

Производит динамическое понижение шума с компенсацией движения. Блоки опорных предыдущих и последующих кадров компенсируются и затем усредняются с текущим кадром с весовыми факторами зависящими от разницы блоков от текущего (SAD). Функции поддерживают режим перекрытия блоков (overlap). Обработка перекрывающихся блоков реализована как оконное суммирование блоков (аналогично FFT3DFilter, величина overlap до blksize/2) для снижения артефактов блочности.

MVDeGrain1 имеет временной радиус 1 (использует вектора предыдущего mvfw и последующего mvbw кадров).

MVDeGrain2 имеет временной радиус 2 (использует вектора двух предыдущих mvfw2, mvfw и двух последующих mvbw, mvbw2 кадров). MVDeGrain3 имеет временной радиус 3 (использует вектора трех предыдущих mvfw3, mvfw2, mvfw и трех последующих mvbw, mvbw2, mvbw3 кадров). Он медленнее, но дает чуть лучшие результаты (более сильное подавление шума).

Параметр "thSAD" определяет мягкий порог суммы абсолютных разностей блоков (SAD), выше которого блоки не дают вклад при усреднении. Блоки с малым SAD имеют наибольший вес. Вы должны ввести величину thSAD приведенную к блоку 8x8. Малые величины могут привести к шахматному понижению шума, большие величины могу привести к призракам и артефактам.
По умолчанию : thSAD=400.

"thSADC" есть аналогичный порог для каналов цветности.
По умолчанию, если не определен, то одинаковые для яркости и цветности thSADC=thSAD. Если определен, то thSAD используется для цветности, а thSADдля яркости.

Параметр plane устанавливает обрабатываемые цветовые плоскости:
0 - яркость, 1 - цветность U, 2 - цветность V, 3 - обе цветности, 4 - все. По умолчанию 4.

limit: предел изменения пиксела (подобно плагину DeGrainMedian, для предотвращения некоторых артефактов). По умолчанию 255 (нет предела).

pelclip: увеличенный исходный клип для использования вместо внутренней субпиксельной интерполяции (для pel=2) (как в MVAnalyse).
По умолчанию не определен.

idx (может) работать как указано для idx в MVAnalyse.

MVRecalculate

MVRecalculate (clip, clip vectors, int "thSAD", int "blksize", int "blksizeV", int "search", int "searchparam", int "lambda", bool "chroma", bool "truemotion", int "lsad", int "pnew", int "overlap", int "overlapV", string "outfile", int "sharp", clip "pelclip", int "dct", int "divide", bool "mc", int "idx", int "sadx264")

Уточняет ранее оцененные (MVAnalyse) вектора движения vectors (и остальные данные) для другого клипа clip или для новых параметров (например меньших размеров блоков), после деления divide, и т.п. Этот двух-стадийный метод может также быть полезным для более стабильной (устойчивой) оценки движения. Уточнение производится только на самом тонком уровне. Интерполированные вектора старых блоков используются как начальные приближения для новых векторов, с пересчетом SAD. Новые векторы только плохого качества, с SAD выше порога "thSAD", будут уточняться поиском. Вы должны ввести величину thSAD, приведенную (масштабированную) к размерам блока 8x8. По умолчанию thSAD=200.

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

III) Примеры

<�р> Во всех примерах предполагается, что в скрипте уже определен некий исходный клип source:
source = AVISource("c:\test.avi") # или MPEG2Source, DirectShowSource, некоторый предыдущий фильтр, и.т.п.

Показать вектора движения (вперед) :

vectors = source.MVAnalyse(isb = false)
MVShow(vectors)

Показать аналогичное назад:

vectors = source.MVAnalyse(isb = true)
source.MVShow(vectors)

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

vectors = source.MVAnalyse(isb = false)
source.MVMask(vectors)

Для шумоподавления:

backward_vec2 = source.MVAnalyse(isb = true, lambda = 1000, delta=2)
backward_vec1 = source.MVAnalyse(isb = true, lambda = 1000, delta=1)
forward_vec1 = source.MVAnalyse(isb = false, lambda = 1000, delta=1)
forward_vec2 = source.MVAnalyse(isb = false, lambda = 1000, delta=2)
return source.MVDenoise(backward_vec2,backward_vec1,forward_vec1,forward_vec2,tht=10,thsad=300)

Чтобы убрать блочность компенсации, хранимой в потоке векторов движения:

vectors = source.MVAnalyse(isb = false, lambda = 1000)
compensation = source.MVCompensate(vectors, mode = 0)
compensation = compensation.Deblock() # используем функцию DeBlock
vectors = vectors.MVChangeCompensate(compensation)

Чтобы понизить шум c pel = 2, эффективно :

backward_vec2 = source.MVAnalyse(isb = true, lambda = 1000, delta = 2, pel = 2, idx = 1)
backward_vec1 = source.MVAnalyse(isb = true, lambda = 1000, delta = 1, pel = 2, idx = 1)
forward_vec1 = source.MVAnalyse(isb = false, lambda = 1000, delta = 1, pel = 2, idx = 1)
forward_vec2 = source.MVAnalyse(isb = false, lambda = 1000, delta = 2, pel = 2, idx = 1)
source.MVDenoise(backward_vec2,backward_vec1,forward_vec1,forward_vec2,tht=10,thsad=300)

Чтобы использовать MVIncrease :

vectors = source.reduceby2().mvanalyse(isb = true)
source.MVIncrease(vectors, horizontal = 2, vertical = 2)

Чтобы использовать MVDepan с плагином Depan для чересстрочного видео (пример функции DepanStabilize):

source = source.AssumeTFF().SeparateFields() # установи корректный порядок полей
vectors = source.MVAnalyse(isb = false)
globalmotion = source.MVDepan(vectors, pixaspect=1.094, thSCD1=400)
DepanStabilize(source, data=globalmotion, cutoff=2.0, mirror=15, pixaspect=1.094)
Weave()

Чтобы сгладить проблемные (блочные) области компенсированного кадра с маской заграждения:

vectors = source.MVAnalyse(isb = false, lambda = 1000)
compensation = source.MVCompensate(vectors) # или используйте MVFlow функцию здесь
# приготовим размытый кадр с некоторой сильной функцией блюра или deblock:
blurred = compensation.DeBlock(quant=51) # используем функцию DeBlock
badmask = source.MVMask(vectors, kind = 2, ml=50)
overlay(compensation,blurred,mask=badmask) # или используйте более быструю MaskedMerge

Чтобы восстановить испорченные кадры интерполяцией c MVFlowInter:

backward_vectors = source.MVAnalyse(isb = true, truemotion=true, pel=2, delta=2, idx=1)
forward_vectors = source.MVAnalyse(isb = false, truemotion=true, pel=2, delta=2, idx=1)
inter = source.MVFlowInter(backward_vectors, forward_vectors, time=50, ml=70, idx=1)
# Предположим плохие кадры 50 и 60
source.trim(0,49) ++ inter.trim(49,-1) \
 ++ source.trim(51,59) ++ inter.trim(59,-1) ++ source.trim(61,0)

Чтобы изменить частоту кадров с MVFlowFps:

# предполагаем прогрессивный PAL 25 fps источник
backward_vec = source.MVAnalyse(isb = true, truemotion=true, pel=2, idx=1)
# мы используем яные номера idx для более быстрой обработки
forward_vec = source.MVAnalyse(isb = false, truemotion=true, pel=2, idx=1)
source.MVFlowFps(backward_vec, forward_vec, num=50, den=1, ml=100, idx=1) # получили 50

Чтобы удвоить частоту видео кадров с MVFlowFps для самой быстрого проигрывания (почти) в реальном времени:

# предполагаем прогрессивный PAL 25 fps или NTSC фильм 23.976 источник
backward_vec = source.MVAnalyse(blksize=16, isb = true, chroma=false, pel=1, searchparam=1, idx=1)
# мы используем яные номера idx для более быстрой обработки
forward_vec = source.MVAnalyse(blksize=16, isb = false, chroma=false, pel=1, searchparam=1, idx=1)
source.MVFlowFps(backward_vec, forward_vec, num=2*FramerateNumerator(source), \
   den=FramerateDenominator(source), mask=0, idx=1)

Чтобы удвоить частоту видео кадров с MVFlowFps для 'наилучших' результатов (но медленной обработки):

# предполагаем прогрессивный PAL 25 fps или NTSC фильм 23.976 источник
backward_vec = source.MVAnalyse(overlap=4, isb = true, pel=2, search=3, idx=1)
# используем перекрытие блоков, полупиксельную точность и исчерпывающий поиск
forward_vec = source.MVAnalyse(overlap=4, isb = false, pel=2, search=3, idx=1)
source.MVFlowFps(backward_vec, forward_vec, num=2*FramerateNumerator(source), \
   den=FramerateDenominator(source), idx=1)

Чтобы изменить частоту (fps) с MVFlowFps2:

# Предполагаем прогрессивный PAL 25 к/с источник. Преобразуем его к 50 к/с.
backward_vec = source.MVAnalyse(isb = true, truemotion=true, pel=2, idx=1, search=3)
# мы используем явное указание idx для более быстрой обработки и полный поиск
forward_vec = source.MVAnalyse(isb = false, truemotion=true, pel=2, idx=1, search=3)
cropped = source.crop(4,4,-4,-4) # обрезка на половину размера блока 8
backward_vec2 = cropped.MVAnalyse(isb = true, truemotion=true, pel=2, idx=2, search=3)
forward_vec2 = cropped.MVAnalyse(isb = false, truemotion=true, pel=2, idx=2, search=3)
source.MVFlowFps2(backward_vec,forward_vec,backward_vec2,forward_vec2,num=50,idx=1,idx2=2)

Чтобы генерировать приятное размытие движения с MVFlowBlur:

backward_vectors = source.MVAnalyse(isb = true, truemotion=true)
forward_vectors = source.MVAnalyse(isb = false, truemotion=true)
source.MVFlowBlur(backward_vectors, forward_vectors, blur=15)

Понижение шума с некоторым внешним фильтром (который использует три кадра: предыдущий, текущий, следующий):

backward_vectors = source.MVAnalyse(isb = true, truemotion=true, delta = 1, idx = 1)
# мы используем явное idx для более быстрой обработки
forward_vectors = source.MVAnalyse(isb = false, truemotion=true, delta = 1, idx = 1)
forward_compensation = source.MVFlow(forward_vectors, idx=1, thSCD1=500) # или используйте MVCompensate
backward_compensation = source.MVFlow(backward_vectors, idx=1, thSCD1=500) # или используйте MVCompensate
# создадим чередующиеся трех-кадровые последовательности
interleave(forward_compensation, source, backward_compensation)

DeGrainMedian() # поместите  предпочитаемый Вами временной (пространственно-временной) фильтр здесь

selectevery(3,1) # возвращает фильтрованные только центральные (не компенсированные) кадры

Чтобы использовать предварительно отфильтрованный клип для более надежной оценки движения, но компенсировать движение нефильтрованного клипа (на примере подавления шума):

# Используем некий шумоподавитель (блюр) или стабилизатор яркости для предварительной фильтрации
prefiltered = source.DeGrainMedian()
backward_vectors = prefiltered.MVAnalyse(isb = true, truemotion=true, delta = 1, idx = 1)
# мы используем явное idx для более быстрой обработки
forward_vectors = prefiltered.MVAnalyse(isb = false, truemotion=true, delta = 1, idx = 1)
# используем нефильтрованный оригинальный клип для компенсации движения (с другим idx)
forward_compensation = source.MVFlow(forward_vectors, idx=2) # или используйте MVCompensate(mode=1)
backward_compensation = source.MVFlow(backward_vectors, idx=2) # или используйте MVCompensate(mode=1)
# создадим чередующиеся трех-кадровые последовательности
interleave(forward_compensation, source, backward_compensation)

DeGrainMedian() # поместите предпочитаемый Вами временной (пространственно-временной) фильтр здесь

selectevery(3,1) # возвращает фильтрованные только центральные (не компенсированные) кадры

Чтобы подавить шум функцией MVDegrain2 с перекрывающимися блоками и субпиксельной точностью :

backward_vec2 = source.MVAnalyse(isb = true, delta = 2, pel = 2, overlap=4, sharp=1, idx = 1)
backward_vec1 = source.MVAnalyse(isb = true, delta = 1, pel = 2, overlap=4, sharp=1, idx = 1)
forward_vec1 = source.MVAnalyse(isb = false, delta = 1, pel = 2, overlap=4, sharp=1, idx = 1)
forward_vec2 = source.MVAnalyse(isb = false, delta = 2, pel = 2, overlap=4, sharp=1, idx = 1)
source.MVDegrain2(backward_vec1,forward_vec1,backward_vec2,forward_vec2,thSAD=400, idx=1)

Чтобы подавить шум чересстрочного источника функцией MVDegrain1 с перекрывающимися блоками и субпиксельной точностью:

fields=source.AssumeTFF().SeparateFields() # или AssumeBFF
backward_vec = fields.MVAnalyse(isb = true, delta = 2, pel = 2, overlap=4, sharp=2, idx = 1)
forward_vec = fields.MVAnalyse(isb = false, delta = 2, pel = 2, overlap=4, sharp=2, idx = 1)
fields.MVDegrain1(backward_vec,forward_vec,thSAD=400,idx=1)
Weave()

Чтобы подавить шум чересстрочного источника функцией функцией MVDegrain2i :

function MVDegrain2i(clip "source", int "overlap", int "dct", int "idx")
{
overlap=default(overlap,0) # величина перекрытия (от 0 до 4 для blksize=8)
dct=default(dct,0) # используйте dct=1 для клиров с некоторыми мерцаниями
idx=default(idx,1) # используйте различные idx для разных источников в том же скрипте
fields=source.SeparateFields() # разделим на поля
backward_vec2 = fields.MVAnalyse(isb = true, delta = 2, pel = 2, overlap=overlap, idx = idx,dct=dct)
forward_vec2 = fields.MVAnalyse(isb = false, delta = 2, pel = 2, overlap=overlap, idx = idx,dct=dct)
backward_vec4 = fields.MVAnalyse(isb = true, delta = 4, pel = 2, overlap=overlap, idx = idx,dct=dct)
forward_vec4 = fields.MVAnalyse(isb = false, delta = 4, pel = 2, overlap=overlap, idx = idx,dct=dct)
fields.MVDegrain2(backward_vec2,forward_vec2,backward_vec4,forward_vec4,thSAD=400,idx=idx)
Weave()
}

source=AVISource("video.avi")
mvdegrain2i(source,4,0,1)

Как использовать внешний клип субпиксельной интерполяции:

# Загрузим Eedi2 плагин (от tritical) с функцией интерполяции с учетом направлений краев
LoadPlugin("Eedi2.dll")
# создадим увеличенный клип из источника
ups = source.LanczosResize(2*width(source), 2*height(source), src_left=0.25, src_top=0.25)
bv = source.MVAnalyse(isb = true, pel = 2, overlap=4, pelclip=ups, idx = 1)
source.MVCompensate(bv, pelclip=ups, idx=1)

Как использовать с MT фильтром и специальной многопоточной версией AviSynth:

# Загрузим плагин MT от TSP
LoadPlugin("MT.dll")
avisource("some.avi")
global idx1 = 10  # глобальная подсказка от IanB
MT("""
idx1 = idx1 + 1
# различные потоки для верней и нижне половины кадра должны иметь разные idx (трюк Foxishadis)
backward_vec2 = MVAnalyse(isb = true, delta = 2, pel = 2, overlap=4, sharp=1, idx = idx1)
backward_vec1 = MVAnalyse(isb = true, delta = 1, pel = 2, overlap=4, sharp=1, idx = idx1)
forward_vec1 = MVAnalyse(isb = false, delta = 1, pel = 2, overlap=4, sharp=1, idx = idx1)
forward_vec2 = MVAnalyse(isb = false, delta = 2, pel = 2, overlap=4, sharp=1, idx = idx1)
last.MVDegrain2(backward_vec1,forward_vec1,backward_vec2,forward_vec2,thSAD=400,idx=idx1)
""",2) # two threads

# Замечание: Режим SetMTMode(2) многопоточного AviSynth также поддерживается MVTools с версии 1.8.4.1 (бета тестирование)

Некоторый пример с SetMTMode:

SetMTMode(5)
FFmpegSource("some.avi") # avisource не работает с SetMTMode на моих машинах - TSchniede

SetMTMode(2)
idx = 1
backward_vec2 = MVAnalyse(isb = true, delta = 2, pel = 2, overlap=4, sharp=1, idx = idx)
backward_vec1 = MVAnalyse(isb = true, delta = 1, pel = 2, overlap=4, sharp=1, idx = idx)
forward_vec1 = MVAnalyse(isb = false, delta = 1, pel = 2, overlap=4, sharp=1, idx = idx)
forward_vec2 = MVAnalyse(isb = false, delta = 2, pel = 2, overlap=4, sharp=1, idx = idx)
last.MVDegrain2(backward_vec1,forward_vec1,backward_vec2,forward_vec2,thSAD=400,idx=idx)

Как использовать предварительно фильтрованный клип и пересчитать данные движения для исходного клипа (пример MVFlowFPS)

prefiltered = source.DeGrainMedian() # некоторое сглаживание
backward = prefiltered.MVAnalyse(isb=true, idx=1, blksize=16)
forward = prefiltered.MVAnalyse(isb=false, idx=1, blksize=16)
# пересчитать для оригинального клипа и другого размера блоков
forward_re = MVRecalculate(source, forward, idx=2, blksize=8, thSAD=100)
backward_re = MVRecalculate(source, backward, idx=2, blksize=8, thSAD=100)
source.MVFlowFps(backward_re, forward_re, num=50, den=1, idx=2)

IV) Отказ (от гарантий)

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

Прошу рассмотреть возможность финансовой поддержки.

MVTools использует части кода из следующих проектов:
Увеличение маски (Resizer) (SimpleResize.cpp) из плагина SimpleResize для Avisynth от Tom Barry. http://www.trbarry.com
Быстрое DCT (fdct_mmx.asm) из XVID MPEG-4 VIDEO CODEC. http://www.xvid.org
DCT общее преобразование (смотри fftwlite.h) из библиотеки FFTW (как вызов DLL). http://www.fftw.org
SATD (pixel-32.asm, pixel.asm) и альтернативная SADx264 (sad-a.asm, x86inc.asm, x86inc-32.asm, cpu-32.asm) из проекта x264. http://www.videolan.org/developers/x264.html (Loren Merritt, Laurent Aimar, Alex Izvorski et al).

V) Ревизии

1.11.4.5 (15.11.2008 by Fizick)

1.11.4.4 (15.10.2008 by Fizick)

1.11.4.3 (08.10.2008 by Fizick)

1.11.4.2 (26.09.2008 by Fizick)

1.11.0.1 beta (08.09.2008 by Fizick)

1.10.2.1 (28.08.2008 jn Fizick)

1.10.2.0 публичная beta (27.08.2008 от Fizick)

1.10.1.0 не публичная (22.08.2008 by Fizick)

1.10.0.0 не публичная (18.08.2008 от Fizick)

1.9.6.x-1.9.7.x ветвь (01.08.2008-26.08.2008 от josey_wells)

1.9.5.7 публичная бета (03.07.2008 от Fizick)

1.9.5.6 (02.07.2008 от TSchniede)

1.9.5.5 (28.06.2008 от TSchniede)

1.9.5.4 (27.06.2008 by TSchniede)

1.9.5.3 (26.06.2008 by TSchniede)

1.9.5.2 (24.06.2008 by TSchniede)

1.9.5.1 public beta (21.06.2008 by Fizick)

1.9.5 (21.06.2008 by TSchniede), основана на v.1.9.3

1.9.4.1 beta (12.06.2008 от Fiziick, выпущена 21.06.2008)

1.9.4 бета (08.06.2008 от Fizick)

1.9.3.1 (05.06.2008 от Fizick)

1.9.3 (20.04.2008 от Fizick)

1.9.2 (29.01.2008 от Fizick, но все ошибки были найдены josey_wells)

1.9.1 бета (15.12.2007 от Fizick)

1.9.0 (04.12.2007 от Fizick)

1.8.6 (02.12.2007 от Fizick)

1.8.5.1 (12.11.2007 от нас:)

1.8.4.3 (05.10.2007 by Tsp)

1.8.5 (05.11.2007 by Fizick)

1.8.4.2 (25.10.2007 by Tsp)

1.8.4.1 (23.10.2007 by Tsp)

1.8.4 (22.08.2007 by Fizick)

1.8.3 (17-20.08.2007 by Fizick)

1.8.2 beta (30.07.2007 by Fizick)

1.8.1 beta (28.06.2007 by Fizick)

1.8.0 beta (22.06.2007 by Fizick)

1.7.0 beta (05.06.2007 by Fizick)

1.6.4 (30.05.2007 by Fizick)

1.6.3 (06.05.2007 by Fizick)

1.6.2 (11.11.2006 by Fizick)

1.6.1 beta (25.10.2006 by Fizick)

1.5.8 beta (14.10.2006 by Fizick)

1.5.3 beta (01.10.2006 by Fizick)

1.5.1 beta (05.09.2006 by Fizick)

1.5.0 beta (23.08.2006 by Fizick)

1.4.13 (28.09.2006 by Fizick)

1.4.12 (25.09.2006 by Fizick)

1.4.11 (06.09.2006 by Fizick)

1.4.10 (18.08.2006 by Fizick)

1.4.9 (14.08.2006 by Fizick)

1.4.8 (31.07.2006 by Fizick)

1.4.7 (25.07.2006 by Fizick)

1.4.6 (24.07.2006 by Fizick)

1.4.5 (22.07.2006 by Fizick)

1.4.4 (19.07.2006 by Fizick)

1.4.3 (17.07.2006 by Fizick)

1.4.2 (16.07.2006 by Fizick)

1.4.1 (23.06.2006 by Fizick)

1.4.0 (19.06.2006 by Fizick)

1.3.1 (11.06.2006 by Fizick)

1.3.0 (05.06.2006 by Fizick)

1.2.6 beta (21.05.2006 by Fizick)

1.2.5 (08.05.2006 by Fizick)

1.2.4 (07.04.2006 by Fizick)

1.2.3 (31.03.2006 by Fizick)

1.2.2 beta (01.03.2006 by Fizick)

1.2.1 beta (20.02.2006 by Fizick)

1.2 beta (17.02.2006 by Fizick)

1.1.1 (16.02.2006 by Fizick)

1.1 (не публичный выпуск 9.01.2006 by Fizick)

1.0.3 (Выпущена 30.12.2005 by Fizick)

1.0.2 (Выпущена 28.12.2005 by Fizick)

1.0.1 (Выпущена 24.12.2005 by Fizick)

1.0 (Выпущена 29.11.2005 by Fizick)

0.9.13.3 (Выпущена 27.11.2005 by Fizick)

0.9.13.2 (Выпущена 22.11.2005 by Fizick)

0.9.13.1 (Выпущена 21.11.2005 by Fizick)

0.9.13 (Выпущена 20.11.2005 by Fizick)

0.9.12.4 (Выпущена 15.11.2005 by Fizick)

0.9.12.3 (Выпущена 14.11.2005 by Fizick)

0.9.12.2 (Выпущена 13.11.2005 by Fizick)

0.9.12.1 (Выпущена 12.11.2005 by Fizick)

0.9.12 (Выпущена 09.11.2005 by Fizick)

0.9.11.1 (Выпущена 06.11.2005 by Fizick)

0.9.11 (Выпущена 04.11.2005 by Fizick)

0.9.10.1 (Выпущена 01.11.2005 by Fizick)

0.9.10 (Выпущена 31.10.2005 by Fizick)

0.9.9.1 (Выпущена 20.01.2005 by Manao)

0.9.9

0.9.8.5

0.9.8.4

0.9.8.3

0.9.8.2

0.9.8

0.9.7

0.9.6.2

0.9.6.1

0.9.5.3

0.9.5.2

0.9.5

0.9.4

0.9.3

0.9.2.1

0.9.2

0.9.1 - 12.05.2004

0.1-0.6 - Выпущена 24.01.2004 - 01.04.2004 by Manao

VI) Скачать (Download)

Download MVTools v.1.11.4.5

Есть также новая MVTools v2.0 ветвь разработки.

Старая версия MVTools v.0.9.9.1 может быть скачена с сайта Manao

$English Date: 2006/09/17 17:47:05 - более свежие версии пока не на CVS $
Русский перевод версии 0.9.9.1 08.07.2005 Turyst04 [email protected]
Редакция и дополнения 14.07.2005 Fizick http://bag.hotmail.ru
Подробное введение, добавленные функции и примеры 31.10.2005-2008 Fizick http://avisynth.org.ru