Zwei Videos Bild für Bild vergleichen

  • Hallo @All,

    ich benötige eine Video-Tool das zwei Eingabevideos Bild für Bild (Pixel für Pixel) vergleicht und die Differenz als Video ausgibt. Normalerweise würde ich alles selbst programmieren, denke aber es müsse doch mit VirtualDub oder AVISynth schneller gehen. Ideal wäre, wenn es ein Filter mit Quelltexten gebe. Den könnte ich dann an meine Bedürfnisse anpassen. Mir würde ein compilierbares Beispiel genügen, wo zwei Eingabevideos eingelesen werden und ein Ausgabevideo daraus erzeugt wird.

    Bin totaler Anfänger was die oben genannten Programme betrifft und weiss deshalb nicht, ob sowas überhaupt mit diesen Programmen machbar ist.

    Bin für jeden brauchbaren Tipp dankbar.

  • Zitat

    Durch Subtract wird ein Clip produziert, bei dem jedes Pixel die Differenz der entsprechenden Pixel in clip1 und clip2 ist.


    Sowas?

    Edit: GRML, da is noch einer wach... ;)

    Edit2: ...noch einer...

    "Diejenigen, die grundlegende Freiheiten aufgeben würden, um geringe vorübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit."
    Benjamin Franklin (1706-1790)

    Meine Erfahrungen in der Open Source-Welt: blog.bugie.de

  • Als einfaches Differenzvideo (wie aussagekräftig es für deine Zwecke ist, weiß ich nicht) würde es mit

    Code
    a=AVISource(...) # bzw. directshowsource, etc...
    b=AVISource(...) # bzw. directshowsource, etc...
    Subtract(a,b)

    gehen...

    Edit: Hm, dritter im Photo-Finish... :zunge:

  • Sag ich doch. :D

    "Diejenigen, die grundlegende Freiheiten aufgeben würden, um geringe vorübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit."
    Benjamin Franklin (1706-1790)

    Meine Erfahrungen in der Open Source-Welt: blog.bugie.de

  • Danke für Eure Antworten!

    Zwischenzeitlich habe ich bemerkt, dass ich meine Frage in den falschen Thread gestellt habe, da es mir eigentlich weniger um die fertige Funktion geht, als vielmehr eine Testumgebung zu haben, in der ich meine Videoaufnahme-Software testen kann. Oder besser gesagt ich möchte keine Videos bearbeiten sondern meine eigene Software auf Fehler testen. Unterandern indem ich die von meiner Software erzeugten Frames mit Referenz-Frames vergleiche.

    Der Thread Software/Software-Entwicklung wäre richtiger gewesen. Das kommt davon wenn man einfach so auf die schnelle in ein Forum reinstürmt - sorry.

    Euer Tipp die Subtract-Funktion zu benutzen ist gut, leider handelt es sich dabei um eine interne Funktion und ich habe es bisher nicht geschafft sie analog zum "SimpleSample"-Invert Beispiel in eine DLL zu separieren. Wenn mir das gelingen würde, wäre ich am Ziel meiner Wünsche. Ist das bisschen Wiki-Text zum Filter-SDK bereits das gesamte SDK, oder habe ich was übersehen?

  • Im Grunde arbeitet die "Subtract"-Funktion in AviSynth ja ganz simpel:

    Ausgabe = 128 + clip1 - clip2

    oder 127, da streite ich jetzt nicht - prinzipiell jedenfalls "mittelgrau". Alles, was also im Ergebnis heller oder dunkler als "mittelgrau" wird, ist offenbar zwischen beiden Bildern unterschiedlich. Und dann kann man den Kontrast ja auch noch erhöhen, um auch geringe Abweichungen besser zu sehen.

    Wobei ich hier vereinfachend von Graustufen oder RGB ausgehe - wie das bei YUV aussieht, ist ein anderer Punkt (bei U und V dürfte "neutral" hier der Wert 0 sein).
    __

    ==> Softwareentwicklung... okay.

  • Hurra ich habe es geschafft!

    Habe aber nun ein merkwürdigen Effekt bei der Subtract-Funktion bemerkt. Dachte zuerst ich habe ein Fehler gemacht. Aber der Fehler tritt auch in der internen Subtract-Funktion auf. Das Ergebnissbild ist nicht einheitlich Grau, wenn man zwei völlig identische AVI-Dateien voneinander subtrahiert. Jedenfalls wenn ich das mit der Datei http://www.www-kurs.de/test-avi.avi versuche. Dann gibt es einzelne Pixel-Ausrutscher. Das muss doch ein Fehler in AviSynth sein. Oder wie kann man das sonst erklären?

    Probiert mal:
    clip1 = AviSource("test1.avi")
    clip2 = AviSource("test2.avi")
    Subtract(clip1,clip2)

    vonbei test1.avi und test2.avi zwei Kopien von http://www.www-kurs.de/test-avi.avi sind.

  • Wie hast du das "Test2.avi" erstellt?

    Wenn du exact beide (clip1 und clip2) dem gleichen AVI zuordnest gibts reines Grau.


    clip1 = AviSource("test1.avi")
    clip2 = AviSource("test2.avi")
    Subtract(clip1,clip2).ColorYUV(off_y=-127)

    Gibt die Differenz im Schwarz Modus wieder ... besser für Masken (diese sollten aber via Levels() Command anstatt ColorYUV() erzeugt werden.

    Du kannst die Differenz auch mit Overlay() anzeigen aber das kommt darauf an WAS du vorhast. Overlay mit seinen Optionen ist wie die "Ebenen"-Optionen in Photoshop.

    clip1 = AviSource("test1.avi")
    clip2 = AviSource("test2.avi")
    Overlay(clip1, clip2, mode= "difference")#.ColorYUV(off_y=-127)

    http://www.avisynth.org/Overlay+Deutsch

  • In der Tat kommt es darauf an, wie die Kopien erstellt wurden: Wurden sie mit einem AVI-Editor neu komprimiert, kann es bei der Verwendung von Codecs, die nicht verlustfrei arbeiten, eventuell Unterschiede geben. Wurden sie dagegen direkt kopiert (per Explorer oder Dateimanager oder "copy"-Befehl) und sind bit-identisch, sollte das nicht passieren.

  • Zitat von BDAH2005

    Dann gibt es einzelne Pixel-Ausrutscher.

    Probiert mal:
    clip1 = AviSource("test1.avi")
    clip2 = AviSource("test2.avi")
    Subtract(clip1,clip2)

    vonbei test1.avi und test2.avi zwei Kopien von http://www.www-kurs.de/test-avi.avi sind.

    Das kann ich bestätigen. Weiß aber nicht warum.

    Brauche ich für ColorYUV(off_y=-127) irgendeine spezielle .dll?

    Zitat von incredible

    clip1 = AviSource("test1.avi")
    clip2 = AviSource("test2.avi")
    Subtract(clip1,clip2).ColorYUV(off_y=-127)

    gibt bei mir eine Fehlermeldung ("Unrecognized exception").

    "Diejenigen, die grundlegende Freiheiten aufgeben würden, um geringe vorübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit."
    Benjamin Franklin (1706-1790)

    Meine Erfahrungen in der Open Source-Welt: blog.bugie.de

  • Zitat von nexustheoriginal

    Brauche ich für ColorYUV(off_y=-127) irgendeine spezielle .dll? gibt bei mir eine Fehlermeldung ("Unrecognized exception").


    http://www.avisynth.org/ColorYUV

    Zitat

    ColorYUV is present in AviSynth from version 2.5

    Also eine "Kernel"-Funktion.

    Aber ich würde die Farbigkeit eigentlich nicht unbedingt vermindern. Ich finde es interessant zu wissen, ob z.B. Unterschiede nur in den U/V-Komponenten auftauchen, oder nur in der Y-Komponente.

  • Also mit

    Code
    clip1 = AviSource("test1.avi")
    clip2 = AviSource("test2.avi")
    Subtract(clip1,clip2).Levels(127,1,129,0,255)

    sieht man diese Fehler ganz deutlich.

    Wenn ich den Clip mit Huffyuv neu kodiere und "substracte" sind diese jedoch verschwunden. :huh:

    "Diejenigen, die grundlegende Freiheiten aufgeben würden, um geringe vorübergehende Sicherheit zu erkaufen, verdienen weder Freiheit noch Sicherheit."
    Benjamin Franklin (1706-1790)

    Meine Erfahrungen in der Open Source-Welt: blog.bugie.de

  • Zitat von incredible

    Wie hast du das "Test2.avi" erstellt?


    Ich meine natürlich zwei durch kopieren erzeugte Dateien die exakt gleich sind. Um jeden Zweifel auszuschließen - Man kann den Fehler auch sehen wenn zweimal die gleich Datei benutzt wird:

    clip1 = AviSource("test.avi")
    clip2 = AviSource("test.avi")
    Subtract(clip1,clip2)

    Zitat von incredible

    Wenn du exact beide (clip1 und clip2) dem gleichen AVI zuordnest gibts reines Grau.


    Nein, nicht wenn ich das AVI von http://www.www-kurs.de/test-avi.avi benutze. Habt ihr es Probiert?

    Zitat von incredible


    clip1 = AviSource("test1.avi")
    clip2 = AviSource("test2.avi")
    Subtract(clip1,clip2).ColorYUV(off_y=-127)

    Gibt die Differenz im Schwarz Modus wieder ... besser für Masken (diese sollten aber via Levels() Command anstatt ColorYUV() erzeugt werden.


    Ich sehe da auch Ausrutscher, nur sind sie jetzt grün. Glaubt mir den keiner? Warum schauen mich alle so mitleidig an ;)

    Zitat von incredible


    Du kannst die Differenz auch mit Overlay() anzeigen aber das kommt darauf an WAS du vorhast.

    Ich habe vor zu testen ob in zwei AVI-Dateien alle Pixel identisch sind, Wenn JA, dann alles Ok, wenn NEIN dann muss ich einen Fehler in meiner Software suchen. Wenn aber das Testsystem (also AVISynth) Differenzen reinbastelt wo keine sind, dann kann ich den Fehler suchen bis mich der Nervenarzt abholt.

    Die oben genannte AVI-Datei war die erste Datei die ich probiert habe und ich habe sie zufällig gefunden indem ich in Google "test avi" eingegeben habe. Ich habe die Datei noch nicht näher untersucht. Es ist mir eigentlich egal warum gerade bei ihr der Fehler auftritt. Weil ich eine Testumgebung brauche auf die ich mich 100% verlassen kann. Wenn vorne das gleiche reingesteckt wird MUSS hinten für alle Pixel das OK rauskommen.

    Oh: Jetzt bin ich nicht mehr der einzige der Fehlpixel sieht. Das beruhigt mich schon mal ;)

  • nexustheoriginal: der Tipp mit Levels ist hilfreich

    @All: Der Fehler ist weg, wenn man statt AviSource DirectShowSource nimmt.
    Ich denke damit ist schonmal gesichert, dass der Fehler von AviSource kommt.
    An der Funktion Subtract dürfte es nicht liegen.

  • Ich habe vor kurzem eine Software geschrieben, die zwei Videos Frame für Frame, Pixel für Pixel vergleicht.

    Als Ergebnis erhält man u. a. den sog. euklidischen Abstand in RGB. Dieser besagt, wie weit ein encodeter Pixel im Durchschnitt von einem Originalpixel im RGB-Farbraum entfernt ist. Ist der euklidische Abstand = 0, dann sind die beiden analysierten Videos absolut gleich.

    Die Software nennt sich Fritz Framalyzer und kann unter
    http://www.josef-kirner.homepage.t-online.de
    heruntergeladen werden.

    Die zugrundeliegenden AVI-Dateien sollten aber zwingend einen Huffyuv- oder Canopus-Header haben und einer der verwendeten Codecs sollte auf dem System verfügbar sein. Zum Testen sollte das aber reichen.

    Ein Differenzvideo wird zwar nicht ausgegeben – das wäre im Übrigen auch kein großes Problem -, aber anhand der Zahlen lässt sich die durchschnittliche „Distanz“ von zwei Videos ermitteln.

    Gruß
    Josef

  • Euklidischer Abstand... Ist sicher für "objektive" Differentbestimmung relativ interessant, auch wenn man da stattdessen wohl eher eine etwas davon abweichende Variante der "mittleren quadratischen Abweichung" (RMS) verwenden würde. Für die Bestimmung der subjektiven Qualität jedoch verwendet man aus guten Gründen einige andere "Metriken", due auch oft eher im YUV-Farbraum arbeiten. Recht bekannt ist (abgesehen von PSNR) vor allem SSIM.

Jetzt mitmachen!

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