Freistellen mit AviSynth

  • Frage:
    Ich hab 2 Videos gemacht, eines enhällt den Hintergrund (hellrot), und das andere enhällt Personen + Hintergrund. Ich möchte jetzt die Personen feistellen.
    Ich hab gelesen das es Filter gibt die bestimmte Farben mit einer gewissen Bandbreite einfach ausfiltern.
    Kann ich auch das Video mit dem Hintergrund verwenden um daraus die Referenzfarben zu gewinnen, und wenn ja wie sieht dann das Script dazu aus ?

  • vermutlich irgendwie so:

    Code
    clip1 = Wie auch immer dein Input ist
    clip1 = clip1.converttorgb32() 
    transparent=resetmask(clip1).colorkeymask(*siehe http://avisynth.org/mediawiki/Layer#ColorKeyMask *)
    clip2 = Wie auch immer dein 2ter Input ist
    clip2 = clip2.converttorgb32()
    ausgabe = layer(clip2, transparent) 
    ausgabe = ausgabe.convertToYv12()
    return ausgabe


    Eventuell könnte man den colorkeymask Teil auch irgendwie 'automatisieren', wenn man einen 3ten Clip hat der komplett die gewünschte Farbe hat, aber wie das dann geht: keine Ahnung :)

    Im wesentlichen musste Dir http://avisynth.org/mediawiki/Layer durchlesen, layer, resetmark und colorkeymask gehören alle zu Layer und sind dort beschrieben.

    Cu Selur

  • Sorry aber damit kann ich nichts anfangen.
    Scheinbar kann colorkeymask nur eine bestimmte Farbe (oder einen bestimten Farbbereich) maskieren, aber wie bekommt man diese Farben vorher aus dem Hintergrundvideo heraus ?
    <Kann ich auch das Video mit dem Hintergrund verwenden um daraus die Referenzfarben zu gewinnen, und wenn ja wie sieht dann das Script dazu aus ?>
    Das ist die eigentliche Frage !

  • Ich gehe davon aus, dass AviSynth nicht in der Lage ist, Farben aus einem Video in einer Art auszulesen, die geeignet wäre, sie auf die Chroma-Maske anzuwenden. Wie sollte man auch definieren, welchen Bereich (räumlich und zeitlich) es sich dafür "anschauen" soll?

    Du wirst das wohl mit einem Grafikprogramm anhand eines Screenshots ermitteln müssen, und mit dem Bereich experimentieren.

  • Na Ja
    Räumlich - Das ganze Video anschauen
    Zeitlich - Das ganze Video anschauen
    Wie beschrieben gibt es ein Hintergrundvideo !

    Da ergibt sich wenn ich sagen wir ein blaues Tuch filme doch eine gewisse Anzahl von Farben.
    Ich bin sehr wohl davon überzeugt das möglich ist.

  • In dem "Leeres-Studio-Video" ist also nichts anderes zu sehen als nur das Tuch - die ganze Zeit über nur die leere Fläche? Sozusagen ein "komplett virtuelles Studio"?

    Das wäre so ziemlich der Idealfall. Das Chroma-Keying soll aber auch funktionieren, wenn man eben den nicht verfügbar hat, also auch sonstige Inhalte andauernd im Video sind. Und da kann man z.B. nicht mal eben über die ganze Bildfläche und Spieldauer einen Mittelwert bilden lassen.

    Leider arbeiten die Mask-Funktionen ausschließlich im RGB32-Format, somit ist also auch ein "Chroma-Keying", das insbesondere Farbton und Sättigung vergleicht, nicht aber die Helligkeit, mit AviSynth so auch nicht möglich, außer mit hoher RGB-Toleranz -- wobei hier die Maskenfarbe als AvISynth-Farbwert angegeben werden muss, also hexadezimal (wie bei HTML-Farben) mit Dollarzeichen davor, z.B. $00FF00 für absolutes grün (was natürlich in einer Kamera-Aufnahme nie vorkommt). Ein guter Anhaltspunkt wäre also sicherlich ein Screenshot, kräftig weichgezeichnet, etwa 1/3 auf der Bilddiagonalen den RGB-Wert abgenommen.
    __

    Eventuell könne man folgendes versuchen:

    Die Funktion Subtract() ermittelt ein Differenzvideo zwischen zwei Videos. Das Ergebnis ist allerdings bei identischen Clips "mittelgrau", man müsste also noch durch eine Art "Absolutbetrag" dafür sorgen, dass Identität schwarz wird und jegliche Abweichung davon heller. Vielleicht sollte man auch Luminanz und Chrominanz hier getrennt betrachten. Ich vermute mal, dass mit LUT-Funktionen da was möglich wäre, wenn das nicht die MaskTools schon komplett anbieten (die kenne ich bisher nicht auswendig).

    Wenn man dann also eine Maske hat, die Differenzen entsprechend absolut als Helligkeit darstellt (möglichst überwiegend nach Chrominanz, und sicherlich auch mit erhöhtem Kontrast oder Gamma - siehe Levels() bzw. Tweak(); ich weiß jetzt nicht, ob Invertierung nötig wäre), kann man diese nun verwenden, um das Studio-Video so über das Hintergrundvideo zu blenden (Layer() / Overlay()), dass - gewichtet nach Übereinstimmung mit dem leeren Studio - die entsprechenden Bereiche des vollen Studios beim Überblenden transparent werden und das Hintergrundvideo durchlassen.

    Zu beachten ist bei dieser Sache, dass YUV-Videos einen Wertebereich von 16-235 haben (TV-Scale), dass die Maske aber wahrscheinlich nur bei einem Wertebereich 0-255 im RGB32-Modus volle Wirkung zeigt. Da wäre also vielleicht ein "Coring" auszugleichen - oder zumindest die englische AviSynth-Dokumentation ganz genau zu lesen.

    Ich glaube, so was lohnt sich als fertiges Funktions-Skript (*.avsi). ;)
    __

    P.S.:

    Hier mal was als Diskussionsgrundlage - insbesondere die Art der Überblendung mit einem reinen "mt_merge()" am Ende ist sicherlich noch nicht das Optimum, aber zumindest der Anfang der Idee.

    VStudio.avsi


    :redface: -- "Ist hier Weibsvolk anwesend?" (Bitte nur eine Tüte Kiesel...)

  • Hallo
    Danke erst mal.
    Aber leider bin ich noch nicht ganz Fix mit allen Tools.
    Um den PHP Code von dir zu testen brauch ich wohl einen Webserver ? IIS oder Apache ?
    OK kann ich machen !
    + PHP (Version ?) und die DLL'S in the right position on the Disk, aber wie führ ich dann das script aus ?
    Gibts zu dem Enviroment eine Installationsanleitung ?
    Oberlässig wär wenn man das wirklich als Webservice einrichten kann - also die 2 Videos hochladen das Ergebnis codieren lassen und dann zum Download bereitstellen !
    Dank dir.

  • Es ist Avisynth Code, das Board kennt nur die Bezeichnung nicht und nennt daher jeden als Code markierten Bereich PHP-Code.
    Du brauchst keinen Webserver sondern lediglich ein installiertes Avisynth und die benötigten avisynth-filter-dlls im Avisynth Autoload-Plugin Ordner (Üblicherweise liegt der im Verzeichnis von Avisynth selbst).

  • Ja, tut mir leid ... wir gehen leider immer noch davon aus, dass Nutzer dieses Forums erst mal einiges an Themen hier bereits gelesen hätten, und dass dabei schon aufgefallen wäre, wie manche gern den PHP-Syntax-Highlighter verwenden, um auch AviSynth-Quelltext gut lesbar darzustellen. Na, vielleicht lag's an der Hitze, dass der Beitrag nur flüchtig überflogen wurde... ;)

    Thema des Beitrages = "Freistellen mit AviSynth"


    __

    Wie auch immer ... was ich da oben gepostet habe, ist ein AviSynth-Skript, das nur Funktionsdeklarationen enthält. Das macht für sich alleine noch nichts, die Funktion muss erst mal verwendet werden. Dazu wird sie importiert. Und dann müssen nur noch die drei Clips geladen werden, die hier benutzt werden sollen.

    Ich habe noch einige Möglichkeiten dazugetan, um die Differenzmaske steiler zu bekommen, damit sehr geringe Differenzen ignoriert und hohe Differenzen gesättigt werden können (anschaulich: vom Graustufen- zum scharfen Schwarz-Weiß-Bild - wie eine Silhouette, nur andersherum). Mit der Option "test=true" wird die Maske selbst angezeigt statt des eigentlichen Filmes.

    Hier also moch mal ein vereinfachtes Beispiel als AviSynth-Skript (trotz PHP-Block; und mit Platzhaltern für die richtige Source-Funktion und die richtigen Dateinamen):

    PHP
    Import("VStudio.avsi")
    
    
    emptyStudio = ___Source("___")
    fullStudio = ___Source("___")
    background = ___Source("___")
    
    
    # ein Beispiel zur Nutzung von SoftThresholdB zur Kontraststeigerung:
    VirtualStudio(emptyStudio, fullStudio, background, st=true, st_sharp=4, st_black=16, st_white=64)

    Größter Nachteil dafür: Alle drei Clips müssen gleiche Eigenschaften haben - gleiche Bildfläche, gleiche Dauer - alle drei müssten über die gesamte Länge vorliegen. Die Aufnahme des leeren Studios könnte dafür eventuell geloopt werden, bis sie lang genug wird.

    Außerdem wird vermutlich die Verarbeitung einer Tonspur micht optimal sein, ich habe mich nur auf das Video konzentriert. Den Ton sollte man vielleicht getrennt produzieren und am Ende dazu multiplexen.

    Und wie schon erwähnt - vielleicht braucht man auch noch eine andere Variante zum Überlagern statt "mt_merge" mit Standard-Optionen.

  • Ich schaff's nicht :)

    Import("C:\Action\VStudio.avsi")


    emptyStudio = ("C:\Input\emptyStudio.avi")
    fullStudio = ("C:\Input\fullStudio.avi")
    background = BlankClip(color=00000000)

    # ein Beispiel zur Nutzung von SoftThresholdB zur Kontraststeigerung:
    VirtualStudio(emptyStudio, fullStudio, background, st=true, st_sharp=4, st_black=16, st_white=64)

    Bringt den Fehler:
    Script error: Invalid arguments to function "VirtualStudio"

    2 Mal editiert, zuletzt von cjud (12. Juli 2010 um 20:54)

  • Doch, doch, Du schaffst das.

  • Cool geht jetzt.
    Noch eins :
    Werd meine Videos so aufnehmen das am Anfang (10 sec) der Hintergrund zu sehen ist und dann die Action davor beginnt.
    Geht das das man dann mit nur einem Video auskommt ?
    Ich hab auch irgendwo gelesen das man die Clipeigenschaften auslesen kann.
    Theoretisch könnte man die dann für den generischen Schwarzen Clip verwenden. (so müsste man die länge ... nicht vorher wissen)
    Dann braucht man für das ganze nur noch einen Clip als Input und erhällt den neuen mit freigestellten Hintergrund. Perfekt :)
    p.s.
    Kann man den neuen Clip auch irgendwie automatisch speichern (auf die Platte schreiben) lassen ? !
    Dann hätt ich den ganzen Vorgang den ich brauch.
    Danke schon mal für die hervorragende Hilfe bisher.
    m.f.g.
    Chris

  • Das Nutzen eines einzigen Clips ginge wohl mit dem Trim()-Befehl: Man hat eine AviSource, die man einer Clip-Variablen zuweist, aus dieser schneidet man mit einem Trim() die ersten paar Sekunden in "emptyStudio" aus, mit einem anderen Trim() den ganzen Rest in "fullStudio", und sorgt mit Floor(fullStudio.FrameCount/emptyStudio.FrameCount) sowie Loop() und Trim() dafür, dass emptyStudio so lange wiederholt wird, bis es genau so lang wie fullStudio wird.

    Wie man "background" auf die Länge und Größe bekommt, die "fullStudio" hat, siehst du schon im Code-Block von Didée: BlankClip(fullStudio, ...) holt sich alle Eigenschaften aus dem Vergleichsclip.

    AviSynth ist ohnehin eigentlich nicht zum Anschauen in Echtzeit gedacht, sondern zum Rendern in eine Folge-Video-Datei. Also die *.avs-Datei in VirtualDub öffnen, Video - Compression, File - Save AVI.

    Ich würde gern mal etwas Testmaterial selber bekommen. Kannst du u.U. eine Aufnahme irgendwo hochladen, in der vielleicht nur mal kurz einer ins Bild und wieder raus geht?

  • Sorry geht jetzt. (ohne Anmeldung :-))
    Alle 4 Videos haben mehr oder weniger den gleichen Sinn:
    Einen eine gewisse Zeit feststehenden Hintergrund, und dann Action die Freigestellt werden soll.
    Die Kugel wird sich am besten eignen, aber die hat auch HD Auflösung.
    m.f.g.
    Chris

  • Nun ja ... das ganze klappt noch nicht ganz wie erwartet. Ich muss da noch ein wenig basteln, insbesondere dass die Chroma-Differenz mehr Einfluss auf die Luminanz der Maske bekommt, aber das scheint bei den MaskTools nicht direkt zu funktionieren, also werde ich da wohl noch mit UtoY und VtoY was kombinieren müssen.

    Wird sicher so in den nächsten Tagen... ;)

  • Habe mir deinen Elvis auch mal angesehen, aber ich kann mir ehrlich gesagt nicht vorstellen, dass du damit einen gescheiten Key her bekommst. Die Ausleuchtung von deiner Box ist nicht gut, zu viele Knicke drin, Karton zu Kopf ist nicht in der gleichen Farbe. Dann ist der Kotrast von BG zu Elvis lange nicht so hoch wie er sein könnte. Warum ist der BG Rot? Macht da nicht viel Sinn. Nimm was am weitesten entfernt liegt. z.B. Grün, das wäre so gar nicht in der Szene.
    Bei diesen Dimensionen sollte es super funktionieren, eine gescheite "Studiosituation" zu bauen.
    eigentlich sollte das ganze auch separat ausgeleuchtet werden. Also eine Beleuchtung für die Box, möglichst homogen und eine Beleuchtung für den Charakter. Dann hast Du nicht ganz so das Problem, dass das Licht vom BG auf den Charakter zurückgestrahlt wird.
    Wenn deine Cam Progressive unterstützt, solltest das nach Möglichkeit auch bei der Aufnahme verwenden, MediaInfo zeigt mir das zwar an, aber das Vid scheint trotzdem Interlaced zu sein. Was man zu dem auch gerne macht, ist die Kameraschärfung zu deaktivieren und erst im Compositing ein Schärfefilter drauf hauen.
    Im Netz findest sicher noch mehr gute Tipps für solche Geschichten.
    Verstehe auch nicht warum das in Avisynth gemacht werden soll. Es gibt auch einige OpenSource Compositing Tool, die das sicher um Längen besser können. Aber ok, mit Avisynth geht es sicher auch :).

    Edit: Aso, Deine Box braucht sicher auch keine Winkel. Pap dein Screen einfach auf eine gerade kamerafüllende Fläche und gut ist ;).

  • Rot und blau haben insbesondere im Modus YV12 (bzw. Chroma-Subsampling 4:2:0, was am häufigsten in der modernen Videobearbeitung verwendet wird) den Nachteil, dass sie nur halbe AUflösung in beide Richtungen haben, also sehr unscharfe Masken ergeben. Deshalb wurde ja von Blue-Box auf Green-Box umgestellt.

Jetzt mitmachen!

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