rechteckigen bereich aus einem frame in einen anderen kopieren

  • hallo,

    weiss nicht, ob das hier das richtige unterformum dafür ist, bei bedarf bitte verschieben.
    ich arbeite mit staxrip und wollte eine kurze videosequenz aus einem vob in ein x264 kodiertes mp4 file wandeln. das ganze klappt auch.
    aber: ich habe an einigen stellen des videos kleine, unschöne weisse "flecken", sowas wie "staub" bei älteren bildern und die würd ich gern entfernen.
    ich würde dazu gern aus einem frame, welcher vor dem/den eigentlichen frames mit den flecken kommt an genau der stelle ein rechteckigen bereich
    ausschneiden und diesen dann in die frames an derselben stelle pasten. das ganze geht, da die szenen fast keine bewegung an der stelle aufweisen.
    jetzt meine frage: wie kann ich das mit avisynth unter staxrip machen? kann ich dazu ein script schreiben, a´la:
    -kopiere bei frame 2345 an den koordinaten 200,300,205,305 den bildbereich und füge diesen bei frame 2346 an position 200,300 ein
    und das dann als zusatzparameter an staxrip übergene? oder ist die vorgehensweise völlig anders?

  • Gute Frage, sinnvoller Forenbereich.

    Grundsätzlich kann man mit Layer() oder Overlay() Bereiche eines Videos mit einem anderen überblenden, und mit Crop() rechteckige Bereiche ausschneiden. Aber das wäre nur die umständliche Lösung. Irgendwie hab ich im Gefühl, dass sich das Überdecken aus dem vorherigen Frame an der selben Stelle auch noch eleganter lösen lässt. Vielleicht hat Fizick da passende Plugins. Oder man müsste mal ein Beispiel der Störungen sehen, um zu schauen, ob sich da vielleicht mit dem MaskTools was machen lässt. Didée hat da bestimmt mehr Ideen als ich, aber wenigstens 2-3 Frames davor und danach als Screenshot oder Video wären schon besser als jede mündliche Beschreibung.

  • die störung ist ein 5x7 pixel grosser heller bereich in einer sonst dunkelbraunen fläche und geht über 2 frames, wobei es im 2. frame nur noch marginal zu sehen ist. es wäre
    mir auch geholfen, wenn ich diesen bereich mit einem festgelegten rgb-wert füllen könnte, das müsste auch besser aussehen als weiss. allerdings hab ich dann die ungleichmässige struktur
    der eigentlichen fläche nicht mehr, welche viel echter wirken würde.
    es ist auch nur eine stelle im video, also nicht besonderes. aber bei genauem hinsehen merkt man es und es fällt auf, weswegen ich da was machen möchte.

  • Wenn die Artefakte nur für einen (1) Frame vorhanden sind, dann ist ein Temporal-Median Filter das naheliegendste. Der RemoveDirt-Filter nimmt ja ebenfalls genau das als Basis, mit zusätzlicher (Deaktivierung bei) Bewegungserkennung, damit bewegte Bereiche nicht zerstört werden.

    Manuelles oder halb-manuelles Ersezen kann man natürlich auch machen ... versuche ich aber nach Möglichkeit zu vermeiden. Gibt es etwas öderes, als eine Videoquelle Frame-für-Frame nach Defekten abzusuchen, und dann Frame-für-Frame geeignete Gegenmaßnahmen zu ergreifen? Das ist ja fast wie Tütenkleben. :D


    Edit - oops, Antwort übersehen.

  • Ach komm, wenn's nur um den einen einzigen Flecken geht ...

    2 Mal editiert, zuletzt von Didée (20. März 2012 um 20:12)

  • danke! jetzt brauch ich nurnoch ne zeit um die befehle zu verstehen bzw. überhaupt den ablauf.
    wird in dem code jetzt ein bildbereich kopiert und woanders eingefügt oder nur ein bereich mit einer farbe verändert?
    wo geb ich denn die quell und zielframes an?

  • Oh, da war noch ein klenies Fehlerchen im Script. Im zweiten Teil stand noch rep1 wo rep2 hätte stehen sollen. Copy+Paste, der ewige Feind. :D (ist jetzt korrigiert)

    Es wird der ganze Frame mit einem Temporal-Median Filter bearbeitet (entweder +/- 1 Frame, oder +/-2 Frames), das bügelt das Schmutzartefakt weg. Dann wird vom gefilterteten Frame nur das kleine Rechteck x:[200,207] y:[300,307] in den Originalframe hineinkopiert. Dann wird das Ergebnis nur für Frame 346, bzw. für die Frames 346+347 übernommen.

  • Das wirkliche spaßige ist: Das Script war immer noch falsch.

    Ich hab die Reihenfolge der Parameter von MedianBlurT verwechselt. Es ist Y,U,V,Temporal, und nicht Temporal,Y,U,V.

    Script zum zweiten Mal korrigiert: (2,0,0,0) ==> (0,0,0,2). Grrr.

  • Auch ein "Foren Gott" ist nur ein Mensch! ;)

    Und ich freue mich immer wieder, den richtigen Riecher zu haben. Mal eben eine UPN-Formel für MaskTools, klar... Da stehen übrigens die Rechteck-Koordinaten drin, tenim. Und die Framenummern in den Trim's. Ganz nach deinen Beispiel-Vorgaben.

    Jetzt nusst du nur beachten, nur entweder den Block mit "rep1" oder den Block mit "rep2" zu verwenden. Am einfachsten vor alle Zeilen, die nicht verwendet werden, ein "# " setzen, dann kann man beide mal probieren.

    Bleibt jetzt nur noch die Frage, wie man das korrekt StaxRip unterjubelt. Bei solchen Konvertier-GUIs sollte es ja im Allgemeinen möglich sein, das AviSynth-Skript, welches vorgeneriert wird, vor dem Start der Konvertierung noch etwas zu bearbeiten.

    Leider dokumentiert Didée seine Skripte immer nur sehr spärlich. Welche Plugin-DLLs du exakt brauchst (mt_masktools: *25.dll für AviSynth 2.5x, *26.dll für AviSynth 2.60), wo man sie herunterladen kann (anfangen bei WarpEnterprises und Fizick) ...

    Auf gute Zusammenarbeit:

    REGELN befolgen | SUCHE benutzen | FAQ lesen | STICKIES beachten

    Einmal editiert, zuletzt von LigH (20. März 2012 um 20:52)

  • hab jetzt raus, wie ich eigene scripte in staxrip einbinden kann. einfach auf "Filters" klicken ->"Profiles..." und dann in der textdatei eine eigene neue kategorie mit filternamen und
    befehlen einfügen.
    z.b.

    [Custom]
    ShowFPS = ShowFrameNumber(scroll=true, offset=0, text_color=$ff0000)

    wenn das script aus mehreren befehlen besteht, muss man diese offenbar mit "%newline%" trennen, so wie es auch bei den anderen befehlen zu sehen ist.

  • ich kriegs nicht zum laufen. offensichtlich existiert die funktion "mt_lutspa" in keiner meiner runtergeladenen mt_masktools.dll´s(laut deren readme´s). hab die letzte "version 2 alpha 2" von WarpEnterprises genommen, auf der page von Fizick fand ich das plugin nicht. ich nutze notgedrungen avisynth 2.5.8, weil das im aktuellen staxrip die basis ist und müsste dazu passend dieses plugin finden. naja, ich hab von anfang an nicht geglaubt das es einfach ist und das hat sich wieder mal bestätigt. warum gibt es nicht einfach ein avisynth-plugin für framebasierte zeichenoperationen:
    rechteck, kreis, pixel zeichnen -fertig. allein einen rgb-pixel manuell setzen würde mir schon reichen. da gibt es wirklich 1000 verschiedene plugins zur videobearbeitung nur für einfachstes zeichnen nichts.

  • Entschuldige ... MaskTools v2 gibt es bei Manao, hier die letzte: masktools-v2.0a48.zip

    In der Dokumentation von alpha 27 existiert allerdings auch nur ein mt_luts. — Hoppla: 27, nicht 47.

    Im doom9-Forenthread wird die Funktion erwähnt (neu in alpha 35). Und so auch in der mitgelieferten Dokumentation von alpha 48 (masktools\documentation\mt_masktools.html – Stand: alpha 45).

    Auf gute Zusammenarbeit:

    REGELN befolgen | SUCHE benutzen | FAQ lesen | STICKIES beachten

    6 Mal editiert, zuletzt von LigH (21. März 2012 um 13:54)

  • Zitat

    Entschuldige

    quatsch, hat doch nichts mit dir zutun.
    ich hab übrigens die von dir verlinkte version genommen und die *25.dll probiert. leider stürzt staxrip bei dem versuch ab, die dll zu laden. "staxrip has crashed".
    die 64bit-version der dll ging auch nicht, aber das sollte ja eigentlich auch so sein, da ich zwar ein 64bit os hab(win7 64), aber avisynth in einer 32bit version vorliegt.

    wer weiss wo es da wieder hängt.

  • Die MaskTools-DLL sollte eigentlich völlig unproblematisch sein, vorausgesetzt dass man die richtige Version verwendet. Über irgendwelche "Spezialitäten" von StaxRip weiß ich allerdings nichts (verwende ich nie, ist mir für meine Anwendungsschemen zu unhandlich).
    Nutzt StaxRip mit seinem Standard-Setup eigentlich "Auto-Loading" von Plugins? Falls ja, dann könnte vielleicht eine ungeeignete DLL im Plugin-Ordner die ganze Sache aushebeln... also: sicherstellen, dass NUR die *-25.dll von der 32bit-Version im Plugin-Ordner liegt, und keine andere zusätzlich.

    Zur Fehlerüberprüfung würde ich einfach VirtualDub nehmen, um das Script zu laden. Die "Entwicklung" irgendwelcher Scripte mache ich ausschließlich mit Vdub (und TextPad).

  • Wenn in der Registry für AviSynth 2.x ein Auto-Load-Verzeichnis eingetragen ist, dann sucht AviSynth dort wahrscheinlich immer nach DLLs, egal von welcher GUI aus es benutzt wird (zumindest weiß ich nichts davon, dass das bei einem Aufruf verhindert werden kann; und StaxRip steuert ja auch bloß andere Encoder an).

    Also besser nicht alle DLLs in "AviSynth 2.5\plugins" werfen und hoffen, sondern gerade bei mehreren spezifischen DLLs besser ein Unterverzeichnis oder ein ganz anderes Verzeichnis benutzen, und nötige DLLs explizit laden mit LoadPlugin (oder LoadCPlugin, je nach Typ). Wenn ich mich recht erinnere, bevorzugt StaxRip auch DLLs in einem Unterverzeichnis unter seiner eigenen Installation, ohne das AviSynth-Verzeichnis in der Registry dort hin zu setzen, muss also dort enthaltene DLLs explizit laden.

  • ne, ich hab nur die eine *25.dll (32bit) in den applications/plugins -ordner von staxrip(nicht avisynths plugins-order) kopiert und diese per script-befehl
    LoadPlugin("...") im script manuell geladen. staxrip lädt keine plugin-dll´s automatisch, so das da keine probleme auftauchen dürften.
    dann hab ich die andere variante probiert: die .dll in den avisynth-plugins-ordner kopiert, von wo sie automatisch geladen wird -selbes resultat: staxrip crashed.
    es könnte villeicht auch daran liegen, das ies an dem script selbst liegt, das ich in staxrip(unter "Filters") eingebunden habe:

    Loadplugin("D:\tools\staxrip\Applications\AviSynth plugins\mt_masktools.dll")
    Loadplugin("D:\tools\staxrip\Applications\AviSynth plugins\medianblur.dll")
    o = last
    mmask = mt_lutspa(relative=false,"x 413 > x 420 < y 194 > y 204 < & & & 255 0 ?")
    rep2 = o.MedianBlurT(0,0,0,2)
    rep2m = mt_merge(o,rep2,mmask)
    o.trim(0,12801) ++ rep2m.trim(12802,12803) ++ o.trim(12804,0)

    villeicht kommt er ins schleudern und versucht bei jedem neuen frame die .dll zu laden, keine ahnung.

    Einmal editiert, zuletzt von tenim (21. März 2012 um 17:17)

  • Jo, Volltreffer. Ohne eine Videoquelle geladen zu haben geht natürlich gar nix.

    Und wenn ich das, wie vorgeschlagen in Vdub probiere, dann kommt auch kein undefinierter Absturz der Anwendung :rolleyes: , sondern es wird ganz brav "invalid arguments to function 'mt_lutspa' " gemeldet. (Weil kein Clip als erstes Argument verfügbar ist.)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!