autor: Alexander G. Balachnin aka Fizick
verze: 1.10.1
stáhnout: http://avisynth.org.ru,
http://avisynth.org/warpenterprises/
kategorie: Různé pluginy
požadavky: YV12 nebo YUY2 Barevné prostředí
licence: uzavřený zdroj
Tento balík obsahuje nástroje (funkce) pro odhad globálního pohybu (pan) ve snímcích, a pro plnou nebo částečnou globální kompenzaci pohybu.
Nástroje mohou být použity pro:
Plugin DePan nahradil můj experimentální GenMotion C-plugin (který používá data pohybu z log souboru VirtualDub pluginu Deshaker).
Balík může pracovat v jednom průchodu, obsahuje serverovou část (funkce DePanestimate) a jednu nebo více klientských částí (funkcí nebo jejich instancí). Serverová funkce odhaduje data pohybu snímků a vysílá je do klientských funkcí na požádání. Jako kontejner pro data pohybu se používá speciální služební klip.
Tato fukce používá metodu fázového posunu (podle rychlé Fourierovy transformace)
pro kompenzaci globálního pohybu.
Používá některé centrální oblasti každého snímku (nebo pole) jako FFT okno pro
nalezení mezisnímkové korelace
a pro výpočet nejvhodnějších hodnot vertikálního a horizontálního
posunutí, které přizpůsobí aktuální snímek předchozímu.
Jako míra důvěry je použit nějaký relativní korelační parametr a ten je také použit pro
detekci změny scény.
V zoom režimu plugin používá levá a pravá podokna pro odhad jak
posunutí tak přiblížení. Výstupem je speciální služební klip se zakódovanými
daty pohybu ve snímcích, a volitelně log soubor.
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)
Poznámky. trust parametry definují některé prahové hodnoty mezisnímkové podobnosti (korelace). To definuje jak podobný musí být aktuální snímek předchozímu snímku ve stejné scéně. DePanEstimare detekuje změnu scény aktuálního snímku, pokud je aktuální hodnota korelace níže než prahová hodnota. Nastavte ji níže pro odvrácení chybných detekcí změny scény, nastavte ji výše pro odvrácení přeskočení skutečné změny scény (s třesením). Výchozí hodnota je dobrá pro většinu videí, ale můžete ji testovat v info režimu.
DePan (klient) - provádí plnou nebo částečnou kompenzaci globálního pohybu
DePanInterleave (klient) - generuje dlouhý prolínaný klip s kompenzací pohybu
DePanStabilize (klient) - stabilizuje pohyb
DePanScenes(klient)
- indikuje změny scén
Generuje klip se snímky s kompenzovaným pohybem, použitím dat pohybu, dříve vypočtených v DePanEstimate.
DePan
(clip, clip data, float offset, int subpixel, float pixaspect, bool matchfields, int mirror, int blur, bool info, string inputlog)
Poznámka: Parametr offset funkce DePan je rozšířenou verzí parametru delta funkce GenMotion.
Generuje dlouhý prolínaný klip se sériemi skupin v pořadí: předchozí
snímky pohybově kompenzované (uvnitř nějakého rozsahu), původní snímek,
následují pohybově kompenzované snímky (uvnitř rozsahu), a stejné skupiny pro
všechny následující snímky.
Ve skutečnosti kombinuje funkci DePan
a vnitřní AviSynth funkci Interleave
pro usnadnění následujícího časového odšumění, s následující funkcí SelectEvery(prev+next+1, prev) pro výběr jen původních očištěných zdrojových snímků.
DePanInterleave
(clip,
clip data, int prev, int next, int subpixel, float pixaspect,
bool matchfields, int mirror, int blur, bool info, string inputlog)
Tato funkce provádí určitou stabilizaci obrazu (deshake) vyhlazením globálního pohybu.
Je použita inerční (setrvačná) metoda (pravděpodobně podobná VirtualDub pluginu Digistudio).
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)
clip - vstupní klip (stejný jako vstupní klip pro DePanEstimate);
data - speciální služební klip s kódovanými daty pohybu, vytvořený pomocí DePanEstimate;
cutoff - frekvence oříznutí potlačovaných vibrací, Hertz (výchozí = 1.0);
damping - poměr tlumení (výchozí = 1.0);
initzoom
- počáteční (minimální) přiblížení (zoom) pro vyplnění okrajů (výchozí = 1.0);
addzoom - použije přídavné adaptivní přiblížení (výchozí=false);
prev - maximální zpoždění některého předchozího snímku pro vyplnění prázdných okrajů (namísto černých):
0 - nevyplňovat (výchozí),
1 - použije nejbližší předchozí (n-1) snímek pro vyplnění obrysů aktuálního snímku (n) ,
2 - použije předchozí (n-2) snímek pro vyplnění (ne vše v rozsahu !),
a tak dále.
next - maximální zpoždění následujícího snímku pro vyplnění prázdných okrajů (namísto černých):
0 - nevyplňovat (výchozí),
1 - použije nejbližší následující (n+1) snímek pro vyplnění obrysů aktuálního snímku (n),
2 - použije následující (n+2) snímek pro vyplnění (ne vše v rozsahu !),
a tak dále.
mirror - vyplní prázdné okraje pixely ze zrcadlových okrajů (namísto černými):
0 - bez zrcadlení (výchozí);
1 - horní;
2 - spodní;
4 - levé;
8 - pravé;
suma výše uvedených - kombinace (15 - celkem ).
blur - rozmazává zrcadlenou zónu použitím dané maximální délky rozmazání (výchozí=0, nerozmazávat; dobré hodnoty jsou nad 30)
dxmax - limit horizontální korekce, v pixelech (výchozí = 60);
dymax - limit vertikální korekce, v pixelech (výchozí = 30);
zoommax - limit korekce přiblížení (jen adaptivní přiblížení, výchozí = 1.05);
rotmax - limit korekce rotace, ve stupních (výchozí = 1.0);
tyto hodnoty omezují korekci (od v1.7 - přibližně, ne přísně )
subpixel - přesnost interpolace pixelu (výchozí = 2)
0 - pixelová přesnost (na nejbližší pixel), žádná interpolace (rychlá),
1 - subpixelová přesnost s bilineární interpolací, (optimální pro odšumění)
2 - subpixelová přesnost s bikubickou interpolací (nejlepší, ale pomalá).
pixaspect - protažení pixelu (výchozí = 1.0);
fitlast - přispůsobí některé poslední snímky rozsahu původním pozicím (celočíselný rozsah, výchozí=0)
tzoom - čas navýšení adaptivního přibližování, v sekundách (desetinný, výchozí=3.0)
info - zobrazí informace o pohybu do snímku (výchozí=false).
inputlog - jméno vstupního log souboru v Deshaker formátu (výchozí - není, nečte)
method - použitá metoda pro stabilizaci:
0 - inerční - setrvačná (výchozí);
1 - průměrná (nová od v1.10)
Generuje klip s hodnotou pixelu =255 pro definovanou plochu při změně scény a hodnotách pixelů =0 v ostatních snímcích,
použitím dat pohybu vypočtených dříve v DePanEstimate.
Může být použit funkcí AverageLuma pro podmíněné zpracování.
DePanScenes
( clip, string inputlog, int plane)
1. Pracuje jen s YV12 a YUY2 barevnými formáty.
2. Používá jen pohyby posunu (pan) a přiblížení (zoom) (ne rotaci), ale
to dává přednosti jako jsou rychlost a stabilita. Odhad v režimu zoom není velmi přesný.
3. Zdrojový klip musí být shodné délky jako klip pohybových dat.
4. Přímo pracuje jen s progresivními klipy. Pro
prokládané zdroje musíte před tím použít AviSynth funkci
SeparateFields
a později Weave
(po kompenzaci pohybu a odšumění), s AssumeTTF
a AssumeBFF
(obě mohou být potřeba pro posunutí lichých polí). Plugin vyhodnocuje
počítaný pohyb od jednoho pole k sousednímu (podle času) poli (od stejného
nebo následujícího snímku). Pro zachování pořadí polí (dominance) a nejlepší
odšumění, nastavte parametr MatchFields=true.
5. Mirror režim je jedinečný, ale trochu divný :-). Použijte blur pro skrytí ostrých zrcadlených detailů.
6. Ne příliš rychlý, bez assembler optimalizace.
7. Testováno s Avisynthem 2.5.3, 2.5.4, 2.5.5, 2.5.6, 2.5.7.
8. Staré verze DePanEstimate používali free FFT2D kód od Takuya Ooura
(http://momonga.t.u-tokyo.ac.jp/~ooura/index.html)
Teď DePanEstimate používá jen rychlejší FFTW knihovnu verze 3 (http://www.fftw.org)
jako Windows binární DLL (kompilovanou v gcc pod MinGW od Alessio Massaro),
která podporuje vlákna a má navíc podporu AMD K7 (3dNow!) k SSE/SSE2.
Můžete ho stáhnout z ftp://ftp.fftw.org/pub/fftw/fftw3win32mingw.zip
Aby jste ji mohli použít musíte vložit soubor FFTW3.DLL z tohoto balíku do některé složky na cestě při prozkoumávání (například C:\WINDOWS\SYSTEM32).
DePanEstimate bez toho NEPRACUJE!
9. Pro nejlepší výsledky, můžete dočasně přidat parametr Info, analyzovat informace a vyladit některé parametry (Trust, dxmax atd).
10. Můžete použít ne přísně stejné klipy pro
odhad pohybu a kompenzaci, například zkuste přidat nějakou
úpravu jasu a kontrastu, předfiltrování, maskování, oříznutí
na vstupní klip použitého jen pro odhad pohybu (a použití jiného zpracování
pro výstupní kompenzované-stabilizované výsledky).
1. Načtěte zdrojový (vstupní) klip (I),
2. Vytvořte klip (F) s plnou dopřednou kompenzací pohybu,
3. Vytvořte klip (B) s plnou zpětnou kompenzací pohybu,
4. Vytvořte prolínaný klip s kompenzovanými snímky před a po každém původním snímku;
Dostaneme dlouhý klip (s trojnásobnou délkou), s každými 3 posloupnými snímky, odpovídajícími stejnému času.
5. Aplikujte nějaký časový filtr, který používá rozdíly pixelu mezi předchozím, aktuálním a následujícím snímkem,
například filtr Fluxsmooth.
6. Vyberte každý třetí (původní nekompenzovaný, ale očištěný) snímek pro výstup.
Očištěný klip nemá mnoho artefaktů, vytvářených globálním pohybem s odšuměním,
a odšumění bude silnější ve většině oblastí (pohyb kamery bude kompenzován.)
Poznámky: s DePanInterleave
, jsou stadia 2,3,4 spojeny do jednoho. Kromě toho může být rozsah větší než 1.
AviSource("input.avi") LoadPlugin("depanestimate.dll") # nebo použijte autonačítání LoadPlugin("depan.dll") # nebo použijte autonačítání LoadPlugin("fluxsmooth.dll") # nebo použijte autonačítání i = ConvertToYV12() mdata = DePanEstimate(i) DePanInterleave(i, data=mdata) FluxSmooth() SelectEvery(3, 1)
Pro nejlepší výsledky můžete dočasně přidat parametr Info, analyzovat informace a vyladit některé parametry (Trust, dxmax atd.).
AviSource("input.avi") LoadPlugin("depanestimate.dll") # nebo použijte autonačítání LoadPlugin("depan.dll") # nebo použijte autonačítání LoadPlugin("fluxsmooth.dll") # nebo použijte autonačítání AssumeTFF() SeparateFields() i = ConvertToYV12() 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()
Testujte prosím pro přidání dalších filtrů do seznamu!
Pro navrženou metodu odšumění s použitím DePan (dříve s GenMotion), takový časový filtr musí porovnat pixel s předchozím a následujícím snímkem, a udělat nějaké vyhlazení, pokud je mezi předchozím a následujícím snímkem malý rozdíl. Tyto filtry také mohou vytvořit dodatečnou vnitřní (malou) lokální kompenzaci pohybu (jako filtr Dust, který může získat nějaké urychlení díky dobré globální kompenzaci pohybu).
DePan může být použit jako nástroj pro převod frekvence snímků a podobné úlohy.
Například pro změnu frekvence snímků se součinitelem=1.5, z progresivních 16.6 fps (staré 8 mm filmy) na 25 fps, použijte skript.
AviSource("kino.avi") i = ConvertToYV12() LoadPlugin("depanestimate.dll") # nebo použijte autonačítání LoadPlugin("depan.dll") # nebo použijte autonačítání data = DePanEstimate(i, range=1, trust=5) 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)
Může to být zapsáno jako funkce:
function fps2to3(clip) { # změna FPS ze 2 na 3 (nebo 16.66 na 25, nebo 20 na 30 atd.), t.j. se součinitelem=3/2 # použije kompenzaci globálního pohybu # vstup musí být YV12 nebo YUY2 progresivní (nebo pravděpodobně rozdělená pole ?) 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") # nebo použijte autonačítání LoadPlugin("depan.dll") # nebo použijte autonačítání ConvertToYV12() fps2to3()Zde je možná funkce pro převod frekvence snímků (progresivní) s faktorem=5/3, například z 15 fps na 25 fps :
function fps3to5(clip) { # změna FPS ze 3 na 5 (nebo 15 na 25, nebo 18 na 30 atd.), t.j. se součinitelem=5/3 # použije kompenzaci globálního pohybu # vstup musí být YV12 nebo YUY2 progresivní (nebo pravděpodobně rozdělená pole ?) 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") # nebo použijte autonačítání LoadPlugin("depan.dll") # nebo použijte autonačítání ConvertToYV12() fps3to5()
Poznámky. Existuje jednodušší a obecnější metoda:
zkuste ChangeFPS
následovanou DePanStabilize
.
DePanStabilize může být použit jako nástroj pro vyhlazení globálního pohybu. V aktuální verzi je použita inerční filtrační metoda.
Jednoduchý příklad skriptu pro progresivní klip:
AviSource("input.avi") LoadPlugin("depanestimate.dll") # nebo použijte autonačítání LoadPlugin("depan.dll") # nebo použijte autonačítání i = ConvertToYV12() mdata = DePanEstimate(i) DePanStabilize(i, data=mdata)
Můžeme přidat a vyladit parametry cutoff, dxmax, metodu vyplnění prázdných okrajů, odpovídající vašemu klipu a vám.
Vytvořte soubor s čísly snímků změn scén. Přehrajte celý klip.
LoadPlugin("depanestimate.dll") # nebo použijte autonačítání LoadPlugin("depan.dll") # nebo použijte autonačítání filename="test.log" avisource("g:\test.avi") ConvertToYV12(interlaced=false) data=DepanEstimate(trust=2.5) WriteFileIf(filename, "(AverageLuma(DepanScenes(data))>30)" , "current_frame")
Funkce DepanEstimate může zapisovat volitelný log soubor s daty pohybu, v Deshaker - kompatibilním formátu. Kromě toho může funkce Depan číst takové log soubory (v tomto režimu pracuje jako GenMotion, bez DepanEstimate, klip s daty je ignorován, a zdrojový klip může být použit jako datový klip). Deshaker log může být načten do Depan a naopak. Depan může také kompenzovat přiblížení (zoom) a rotaci. Proto můžete načíst podobné AVS skriptové soubory do VirtualDubu, a spustit druhý průchod Deshaker pro pokročilou stabilizaci obrazu (a kódování) filtrovaného klipu. Samozřejmě, před tím musíte spustit první průchod DePanEstimate pro vytvoření Depan.log souboru, který musí být vybrán v Deshaker. Místo toho, můžete do skriptu přidat funkci DePanStabilize(i,data) a spustit vše v jednom průchodu !
Od v1.9.2 je možné zapsat rozšířený log soubor s přídavnými daty "Trust" po snímku.
V průběhu 1. průchodu zkouší plugin Deshaker najít hodnoty posunutí, rotace a přiblížení které, když se použijí na aktuální obraz, vytváří to, že vypadá jako předchozí obraz (téměř). Hodnoty v každém řádku souboru jsou (z leva do prava): číslo snímku (nebo číslo pole), x- a y-posunutí (v pixelech), rotace (ve stupních) a součinitel přiblížení. Můžete log soubor upravit ručně (ale použijte pevný formát řádku). Můžete smazat řádky, které jsou úplně špatné (i Deshaker chybuje). Chybějící řádky se stejnými čísly snímků jsou brány jako s nulovým posunem, nulovou rotací a bez přiblížení. Pokud existují řádky se stejnými čísly snímků, použije se poslední řádek.
Poznámka: Pro prokládaný zdroj je informace pro každé pole (A - první, B - druhé v čase)
Depan & DepanEstimate používají snímkový buffer speciálního klipu pro uchování dat pohybu.
Když klient (Depan) žádá data pohybu pro snímek n
z tohoto klipu,
server (DepanEstimate) vytvoří snímek a zapíše do něj taková data (na začátku snímkového bufferu):
jeden záznam hlavičky, a záznamy dat pohybu několika snímků, od n-rozsah
do n+rozsah
(nsnímků = 2*rozsah+1
pro ne-krajní snímky).
Definice parametrů dat pohybu je stejná jako v Deshaker logu.
Ve všech verzích od 0.6 používám tyto struktury:
#define DEPANSIGNATURE "depan06" typedef struct depanheaderstruct { // structure of header depandata in framebuffer char signature[8]; // signature for check 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 DePanEstimate) } depandata;
Poznámka 1. Depan používá dx=0.0 jako značku změny scény.
Poznámka 2. Výstup z DepanEstimate je oříznut, pokud není v zobrazovacím nebo info režimu.
Viz. depanio.cpp zdrojový kód pro podrobnosti.
Před nějakým časem jsem přidal do odhadu lokálního pohybu pluginu MVTools
od Manaa (od verze 0.9.8.2)
novou funkci MVDepan
pro odhad globálního pohybu.
Je založen na analýze vektorů pohybu lokálních bloků, podobné prvnímu průchodu v pluginu DeShaker.
Funkce MVDepan
může být použita místo DepanEstimate
.
Může odhadovat posunutí, přiblížení a rotaci.
Trocha diskuze o pluginech GenMotion a DePan je v AviSynth fóru na
http://forum.doom9.org/forumdisplay.php?s=&forumid=33
zvlášť ve vlákně
http://forum.doom9.org/showthread.php?s=&threadid=66686
Děkuji Gunnaru Thalinovi za detailní informaci o formátu Deshaker log souboru a velmi užitečnou diskuzi.
Díky Takuyaovi Oouraovi za free a rychlý FFT2D kód použitý v prvních verzích DePan.
Díky scharfis_brain a mnoha dalším za užitečnou diskuzi a zprávy o chybách.
Plugin DePanEstimate je free software distribuovaný pod licencí GNU GPL. Viz gpl.txt pro podrobnosti.
Plugin DePan je freeware, BEZ JAKÉKOLI ZÁRUKY. Nesmíte ho distribuovat bez této dokumentace.
Dokumentace je distribuována pod CreativeCommons BY-SA 3.0 license.
Zvažte prosím dotaci, aby jste se stali registrovaným uživatelem.
Stáhnout DePan Tools verze 1.10.1
Stáhnout DePanEstimate verze 1.9.2
$English Date: 2006/08/25 02:18:25 $
Český překlad:23.4.2009