Greenscreen-Effekt mit Avisynth

  • Hallo zusammen,

    obwohl ich mich mit Avisynth einigermaßen auskenne und ich auch die entsprechenden Foren durchsucht habe, kann ich ein Problem nicht lösen, das das Plugin ColorGreenMask betrifft. Möglicherweise würde mir ein kleines Beispielscript helfen, das ich allerdings nirgendwo gefunden habe.

    Das Problem ist folgendes: Ich habe ein Video, das als Hintergrund dienen soll und ein zweites Video, das vor einem grünen Hintergrund aufgenommen worden ist. Nun will ich den grünen Hintergrund des zweiten Videos durch den Inhalt des ersten Videos ersetzen.

    Das muss irgendwie wie folgt gehen:

    Code
    h=DirectShowSource("Video1")
    h=ConvertToRGB32(h)
    v=DirectShowSource("Video2")
    v=ConvertToRGB32(v)
    v=ColorGreenMask(v,"global","green")
    Layer(h,v,???)     #Overlay(???)


    aber an der Stelle hört es bei mir auf und ich komme nicht weiter. Wahrscheinlich ist es ganz einfach, aber ich komme irgendwie nicht drauf.

    Jegliche Tipps sind willkommen.

    Viele Grüße
    Gerold

  • Vorbemerkungen:

    Gibt es nichts besseres als DirectShowSource? Welches Format haben denn die Quellen, wäre da eher AviSource oder FFVideoSource oder LWLibavVideoSource geeignet?

    Und wenn das Ergebnis eventuell "interlaced YV12" ist, müsste man das bei ConvertToRGB32 berücksichtigen.

    Das Plugin heißt übrigens ColorScreenMask. Ist wohl etwas angenehmer zu verwenden als ColorKeyMask.
    __

    Bei der Verwendung von ColorKeyMask hast du noch die Funktion Mask, die die Helligkeit des Masken-Clips als Alphakanal in den Overlay-Clip einbindet, damit der dort transparent über dem Basis-Clip liegt. Das macht ColorScreenMask schon selber (wobei dessen – auch mehrfache – Anwendung alles nur transparenter macht, niemals "blickdichter").

    Allerdings ist es meiner Meinung nach übersichtlicher, lieber mal eine Clip-Variable mehr zu haben, und die auch noch offensichtlich zu benennen.

    Ansonsten ist Layer zwar ausführlich dokumentiert, aber ich gebe zu, dass man mehrmals lesen muss, um die Modi zu verstehen...

    Code
    base = [i]Bessere[/i]Source("Video1").ConvertToRGB32(interlaced=[i]{false|true}[/i])
    overlay = [i]Bessere[/i]Source("Video2").ConvertToRGB32(interlaced=[i]{false|true}[/i])
    masked = ColorScreenMask(overlay, "global", "green")
    Layer(base, masked, "add", 257)
  • Vielen Dank für die Antwort. Ich hatte meinen Beitrag an einem anderen Rechner geschrieben, als dem, auf dem Avisynth läuft. Daher waren die Quell-Filter eher symbolisch gemeint, und so ist auch mein Vertipper zu erklären, dass im Wort "ColorScreenMask" plötzlich ein "G" aufgetaucht ist.
    Nichtsdestotrotz habe ich aber versucht alle Ratschläge zu befolgen und bin dennoch nicht zum Ziel gekommen. Daher beschreibe ich nun alles möglichst exakt.
    Der Hintergrundclip wird von einem Bild im Format 3840x1080 erzeugt, das auf 1920x1080 gecroppt wird. Hier ist ImageSource angebracht, ferner wird die Zahl der Frames und die Bildfrequenz an den Überlagerungsclip angepasst. Letzterer ist ein progressiver avi-Clip mit 50 fps, so dass hier AviSource angewandt wird. Der Clip ist bis auf einen Bereich in der Mitte im äußeren Bereich grün.
    Mein Originalscript sieht dann so aus:

    Code
    base_clip = ImageSource("Si08-028_012_cs.bmp",0,4778,50).ConvertToRGB32(interlaced=false).crop(0,0,-1920,0)
    overlay_clip = AVISource("quelle.avi").ConvertToRGB32(interlaced=false)
    masked = ColorScreenMask(overlay_clip,"global","green")
    Layer(base_clip,masked,"add",257)


    Wie bereits gesagt, erhalte ich nicht das gewünschte Ergebnis. Es wird als Ergebnis der Overlay-Clip mit dem grünen Hintergrund angezeigt.

    Viele Grüße
    Gerold

  • Dann wirst du wohl mit den zusätzlichen Parametern in ColorScreenMask experimentieren müssen, wie tolerant das "grün" erkannt und maskiert wird. Das kann eine Fummelei werden...

    Wenn die Farbe ziemlich stabil ist, ist vielleicht ColorKeyMask hier einfacher zu verwenden, weil man die zu maskierende Farbe ähnlich wie bei HTML mit Hexadezimalwert angeben kann (nur mit $ statt #), und von da aus mus die Toleranz vielleicht nicht so groß sein wie von echt reinem Grün ($00FF00).

  • Nachdem durch die letzte Antwort klar geworden ist, dass das Problem wohl an den weiteren Parametern von ColorScreenMask liegt, habe ich mir diese genauer angesehen. Als Kandidat kam gth in Frage, der "global keycolor threshold". Er ist normalerweise auf 150 voreingestellt. Als ich ihn probehalber auf 0 setzte, funktionierte plötzlich alles, so wie es sollte. Eine genauere Untersuchung ergab dann, dass es mit Werten unter 64 funktioniert und ansonsten nicht.

    Damit ist erfreulicherweise mein Problem gelöst. Nochmals vielen Dank für die Hilfe .

Jetzt mitmachen!

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