PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zwei Videos Bild für Bild vergleichen


BDAH2005
22. May 2005, 20:49
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.

Garf
22. May 2005, 21:45
Irgendwie gibt es dafür ein Avisynth-Filter.

illCP
22. May 2005, 23:20
http://forum.gleitz.info/showthread.php?t=22418&page=3&pp=8


Scharfis Post mit subtract, levels etc. - suchst du sowas ?

nexustheoriginal
22. May 2005, 23:20
Durch Subtract wird ein Clip produziert, bei dem jedes Pixel die Differenz der entsprechenden Pixel in clip1 und clip2 ist.
Sowas (http://www.avisynth.org/Subtract+Deutsch)?

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

Edit2: ...noch einer...

doxville
22. May 2005, 23:20
Als einfaches Differenzvideo (wie aussagekräftig es für deine Zwecke ist, weiß ich nicht) würde es mit a=AVISource(...) # bzw. directshowsource, etc...
b=AVISource(...) # bzw. directshowsource, etc...
Subtract(a,b)gehen...

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

illCP
22. May 2005, 23:21
Edit: GRML, da is noch einer wach... ;)
Sogar zwei...:D

nexustheoriginal
22. May 2005, 23:22
Sag ich doch. :D

BDAH2005
23. May 2005, 19:28
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?

LigH
23. May 2005, 19:35
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.

BDAH2005
24. May 2005, 12:17
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.

incredible
24. May 2005, 12:37
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

LigH
24. May 2005, 14:58
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.

nexustheoriginal
24. May 2005, 15:40
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? clip1 = AviSource("test1.avi")
clip2 = AviSource("test2.avi")
Subtract(clip1,clip2).ColorYUV(off_y=-127) gibt bei mir eine Fehlermeldung ("Unrecognized exception").

LigH
24. May 2005, 15:45
Brauche ich für ColorYUV(off_y=-127) irgendeine spezielle .dll? gibt bei mir eine Fehlermeldung ("Unrecognized exception").
http://www.avisynth.org/ColorYUV
ColorYUV is present in AviSynth from version 2.5Also 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.

nexustheoriginal
24. May 2005, 15:59
Also mit 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:

BDAH2005
24. May 2005, 16:27
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)

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?


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 ;-)


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 ;-)

BDAH2005
24. May 2005, 16:41
@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.

LigH
24. May 2005, 16:50
Levels(127,1,129,0,255)

halte ich allerdings für erheblich übertrieben. Weniger als +/- 32 oder +/- 16 weg von 128 muss nicht sein. Beispiel:

Levels(96,1,160,0,255)

Fritz Framalyzer
24. May 2005, 23:10
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

LigH
24. May 2005, 23:30
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.

Fritz Framalyzer
24. May 2005, 23:41
Das Programm errechnet auch bekannte Werte wie MSE (mean squared error) und PSNR (peak signal-to-noise ratio) im YUV-Farbraum (und zwar getrennt für Y-, U- und V-Komponente). Mir ging es aber zunächst nur um eine möglichst „objektive“ Berechung – daher auch die Einführung des euklidischen Abstands.

Gruß
Josef

Selur
25. May 2005, 07:02
vielleicht für euch auch interessant:
Video Quality Studio von http://www.everwicked.com/vqstudio/

BDAH2005
25. May 2005, 09:54
@Fritz und Selur: Vielen Dank für eure Infos. Die Links sind sehr interessant. Leider komme ich zur Zeit nicht dazu mich näher damit zu beschäftigen.

@All:
Mein Ziel ist es, wie bereits geschrieben, meine eigene Software auf fehlerfreiheit zu
testen. Deshalb brauche ich eigentlich nur eine Software die jede beliebige Video-Datei
einlesen kann und die Frames meiner eigenen Testfunktion zur Verfügung stellt.
VirtualDub+AviSynth ist da schon sehr gut geeignet, da sich alles so schön automatisieren lässt.

Ich werde vorerst auf die DirectShowSource Funktion ausweichen. AviSource scheint ja sowieso nur eine Untermenge von den einlesen zu können, was DirectShowSource kann. Bitte sagt mir bescheit, inwieweit diese Vermutung stimmt.

Wenn jemand Kontakt zum Entwicklerteam von AviSynth hat, sollte er dort das Problem mit AviSource melden. Würde mich freuen deren Meinung zu erfahren.

Ich habe es jetzt geschafft einen Filter mit zwei Eingängen zu programmieren - naja, eigentlich nur zusammenkopiert. War einfach, mann muss nur der Versuchung widerstehen alles verstehen zu wollen. Insoweit habe ich mein Ziel erreicht.

nexustheoriginal
25. May 2005, 12:23
Wenn jemand Kontakt zum Entwicklerteam von AviSynth hat, sollte er dort das Problem mit AviSource melden. Würde mich freuen deren Meinung zu erfahren. Also für mich ist das Problem noch nicht klar. Mit was ist der Clip eigentlich kodiert?
bei mir wird das auch nicht ordentlich dekodiert, viele schwarze Flecken, wenn ich mit VDub öffne.

codefish
25. May 2005, 12:36
Ich werde vorerst auf die DirectShowSource Funktion ausweichen. AviSource scheint ja sowieso nur eine Untermenge von den einlesen zu können, was DirectShowSource kann. Bitte sagt mir bescheit, inwieweit diese Vermutung stimmt.

Schau Dir doch mal die AviSynth-Doku an: http://www.avisynth.org/DirectShowSource+Deutsch

vielleicht für euch auch interessant:
Video Quality Studio von http://www.everwicked.com/vqstudio/
Cool wieder was zum spielen für mich :) danke für den Link, der war mir noch unbekannt!

Grüße

codefish

LigH
25. May 2005, 12:48
Ich hab's auch mal ausprobiert. Und wollt ihr wissen, warum das Fehler ergibt? Dann probiert malclip1 = AviSource("test1.avi")
clip2 = AviSource("test2.avi")
diff = Subtract(clip1,clip2)
StackHorizontal(clip1, StackHorizontal(diff, clip2))Ich gehe davon aus, dass der Cinepak-Codec "nicht reentrant" ist -- also nicht zwei Videos gleichzeitig parallel decodieren kann.

Zum Test wollte ich gleich mal versuchen, ffdshow als VfW-Codec zum Decodieren von Cinepak-AVIs einzustellen. Ging aber nicht, der Cinepak-VfW-Codec scheint hier immer bevorzugt zu werden.

Nächster Versuch:clip1 = DirectShowSource("test1.avi")
clip2 = DirectShowSource("test2.avi")
diff = Subtract(clip1,clip2)
StackHorizontal(clip1, StackHorizontal(diff, clip2))Hier funktioniert es je nach verwendetem Decoder auch unterschiedlich: Ist ffdshow an der Reihe, klappt es wie erwartet, keine Unterschiede. Mit Cinepak als Decoder gibt es eine Verschiebung von einem Bild. Das bestätigt meinen Verdacht: Wenn Cinepak ein Bild aus dem zweiten AVI holen soll, wird statt dessen das nächste Bild aus dem ersten AVI gelesen.

Beim Schließen des Skriptes stürzt VirtualDubMod übrigens ab...

BDAH2005
25. May 2005, 14:42
He LigH, du hast mich echt beeindruckt. Man merkt dass du ein Video Profi bist. Deine Beweisführung - Einfach Suuuuuuuper!

Ich habe zwischenzeitlich den Rat von codefish befolgt und mir die Doku zu DirectShowSource und AviSource durchgelesen.
Nachdem was da steht müsste AviSource die VfW-Codec's bevorzugen. Wenn ffdshow ein VfW-Codec ist, dann hätte bereits das Installieren von ffdshow den Fehler beseitigen müssen.
LigH schreibt aber dass sich nur mit DirectShowSource der fehlerhafte Cinepak Decoder umgehen lässt. Das verstehe ich nicht.

Besonders würde mich nun interessieren wie die Suche nach den richtigen Codec vonstatten geht und ob es Debug-Möglichkeiten gibt um rauszubekommen welche Verarbeitungskette dann tatsächlich benutzt wird.
Wer bestimmt in welcher Reihenfolge die Decoder ausgesucht werden? Gibt es generell eine Möglichkeit, wenn mehrere Decoder für einen Codec installiert sind, die Benutzung eines bestimmten zu erzwingen?
Fragen über Fragen, wahrscheinlich sollte ich die lieber in ein Newbie-Thread stellen?

LigH
25. May 2005, 14:52
Nachdem was da steht müsste AviSource die VfW-Codec's bevorzugen. Wenn ffdshow ein VfW-Codec ist, dann hätte bereits das Installieren von ffdshow den Fehler beseitigen müssen.
LigH schreibt aber dass sich nur mit DirectShowSource der fehlerhafte Cinepak Decoder umgehen lässt. Das verstehe ich nicht.
Der Grund ist: ffdshow ist beides - zuerst ein DirectShow-Filter, nebenbei aber auch ein VfW-Codec.

DirectShow-Filter lassen sich in einer Reihenfolge einstellen, welcher bevorzugt wird und welcher eher vermieden werden soll, wenn mehrere für das gleiche Format zuständig sind. Deshalb kann man auch leicht einstellen: "Benutze den ffdshow-DS-Filter zum Anzeigen von Cinepak-Videos." - oder zum Decodieren per DirectShowSource(). Und ihn auch genauso leicht wieder deaktivieren.

Bei VfW-Codecs ist diese Reihenfolge aber leider nicht so einfach festzulegen. Es kann also gut sein, dass mehrere Codecs bei AviSource für das Decodieren des gleichen Videoformates in Frage kämen, aber immer nur der selbe tatsächlich zum Zuge kommt. Nämlich der, der in der Registry oder SYSTEM.INI dafür registriert wurde.

Besonders würde mich nun interessieren wie die Suche nach den richtigen Codec vonstatten geht und ob es Debug-Möglichkeiten gibt um rauszubekommen welche Verarbeitungskette dann tatsächlich benutzt wird.
Die kann GSpot relativ detailliert im unteren Bereich seines Fensters für DirectShow-Filterketten melden (die kleinen Buttons "1" und "2"). Bei VfW-Codecs ist der Fall wesentlich kürzer (da reicht in VirtualDub "File - File information", oder auch der obere rechte Bereich von GSpot).