• Herzlich Willkommen!

    Nach der Schließung von inDiablo.de wurden die Inhalte und eure Accounts in dieses Forum konvertiert. Ihr könnt euch hier mit eurem alten Account weiterhin einloggen, müsst euch dafür allerdings über die "Passwort vergessen" Funktion ein neues Passwort setzen lassen.

    Solltet ihr keinen Zugriff mehr auf die mit eurem Account verknüpfte Emailadresse haben, so könnt ihr euch unter Angabe eures Accountnamens, eurer alten Emailadresse sowie eurer gewünschten neuen Emailadresse an einen Administrator wenden.

Video in Einzelbilder zerlegen

Sweetflake

Member
Registriert
2 August 2003
Beiträge
238
Punkte Reaktionen
0
Ich schreibe an einem Programm, welches Schnitte in Videos erkennen soll. Dazu muss ich aber auf die Einzelbilder zugreifen können.

Kennt einer von euch ein Programm, welches das kann oder eine Bibliothek für C/C++, mit der ich das selber programmieren kann?
 
Um so ein Programm zu schreiben, müsste man erst mal wissen, welche Art von Film-Material du bearbeiten willst. Nicht jeder Film besteht aus vollständigen Einzelbildern. Wenn du zum Beispiel einen MPEG-kodierten Film hast, dann gibt es da alle 10 Frames mal ein vollständiges Bild und danach dann 10 Frames, wo nur die Differenzen zum Vorgänger gespeichert sind.

Anders ausgedrückt: Du solltest dich mal mit den gängigen Standards beschäftigen und die ansehen, wie diese Bilder speichern.

Die vollständigen Einzelbilder eines Films kriegt man mit jedem DVD-Creator zu sehen.
 
Die Unterschiede der einzelnen Formate kenne ich schon. Ich hab allerdings ein Programm, mit dem ich alle gängigen Formate konvertieren kann.

Der Einfachheit halber wollte ich Motion JPEG verwenden, hab allerdings noch keine vernünftige Bibliothek gefunden.
 
Wenn's C/C++ (ggf. C#) wird, hast schon unter MSDN/MS versucht? GGf. haben sie die Biblios
 
Ich arbeite nur leider unter Unix. Da wird mit Microsoft nicht so wirklich helfen.
 
Was meinst Du jetzt mit: "Dazu muss ich aber auf die Einzelbilder zugreifen können."

Willst Du das live beim Abspielen machen, mit Delay oder völlig asynchron?

Ein Weg wäre vielleicht vom Lieblingsplayer, zu dem es logischerweise Sourcen gibt, den Framebuffer auszulesen. Das dürfte der einzige Punkt sein, wo das Einzelbild vollständig vorliegt. Mit ein bisschen Glück sind das vielleicht nur ein paar Zeilen Code.

Ich weiß zwar nicht, mit was für einer Präzision Du arbeiten möchtest, aber eine weitere Umwandlung in ein verlustbehaftetes Bildformat dürfte der Sache nicht förderlich sein.

Mich würde schon mal interessieren, was Du damit erreichen willst.
 
Das Ganze soll nicht in Echtzeit stattfinden. Allerdings benötige ich die einzelnen Frames, um beispielsweise Histogrammdifferenzen zu berechnen oder Ort-Zeit-Bilder zu erstellen.
 
Du willst anscheinend anhand des Unterschieds zweier aufeinanderfolgender Bilder erkennen, ob dazwischen ein Schnitt vorliegt. Das ist so bei MPEG aber nicht ohne weiteres möglich bzw. nur an bestimmten Stellen des Filmmaterials, nämlich nur dort, wo wieder ein vollständig digitalisiertes Bild vorliegt. Dieses könnte man mit dem Frame zuvor vergleichen.

Ich weiß ja nicht, wozu das insgesamt dienen soll, aber auf Grund der in MPEG gebräuchlichen Transformationen könnte es sein, dass es mit diesem Format überhaupt nicht geht.

MPEG speichert wie oben angedeutet nur Differenzen zwischen zwei Bildern, um das zweite aus dem ersten zu berechnen. Im Grunde beinhaltet so ein Frame schon genau die Differenz zwischen dem Frame selbst und seinem Vorgänger.

Deswegen meine Frage, ob du weißt, was da passiert. Ohne Kenntnis der exakten Funktionsweise des verwendeten Standards dürfte es ausgeschlossen sein, das zu programmieren, denn selbst wenn du zwei aufeinander folgende Frames herausextrahiert bekommst als komplette Einzelbilder, so hast du trotzdem nicht viel gewonnen, weil die Berechnung der zweiten Bildes auf Grundlage des ersten Bildes passiert ist.

Ich will nur verhindern, dass du in eine Sackgasse läufst, weil du die Technik dahinter nicht kennst.
 
Ich hab doch nie gesagt, dass ich MPEG verwenden will.

Motion JPEG(MJPEG) != MPEG

Bei Motion JPEG ist eben der Vorteil, dass jeder Frame einzeln codiert ist und nicht von den Vorgängern abhängt.
 
Ich hab allerdings ein Programm, mit dem ich alle gängigen Formate konvertieren kann.
Das eigentliche Problem ändert sich nicht dadurch, dass du zuvor alles nach Motion JPEG konvertierst. Ich rede davon, dass deine Aufgabe vermutlich überhaupt nur durchführbar ist, wenn das Ausgangsmaterial dies auch zulässt. Dazu kommt, dass eine Konvertierung wiederum (unsichtbare) Bildinformationen verschwinden lässt (das ist das Prinzip quasi aller JPEG-Verfahren), so dass ein Vergleich zweier Bilder, selbst wenn sie einander ähnlich sind, böse ins Auge gehen kann.

Zudem gibt es verschiedene, zueinander inkompatible Arten von Motion JPEG, das heißt, du müsstest also die passende C++-Library zu dem von dir verwendeten Kompressionsalgorithmus finden. Also das Tool, mit dem du die Konvertierung durchführst, benutzt dazu einen speziellen Algorithmus. Wenn du den nicht raus kriegst, hilft dir eine C++-Library höchstens zufällig weiter, wenn sie zufällig den verwendeten Algorithmus implementiert.
 
Wenn ich Dich richtig verstehe, willst Du irgendwelches Videomaterial Bild für Bild auswerten. Da Du Einzelbilder benötigst, willst Du es in MJPEG umwandeln. Das impliziert, dass das Ausgangsmaterial nicht in einem Kompressionsformat vorliegt, welches in Einzelbildern speichert (wie z.B. DV oder MJPEG). Da liegt der Schluß, dass das Ausgangsmaterial in MPEG2 oder 4 codiert ist natürlich auf der Hand.

Richtig?

Deswegen ist in meinen Augen (wie auch in dragos) eine Konvertierung in MJPEG der falsche Weg, wenn schon Einzelbilder, dann als unkomprimierte, bestenfalls RLE/LZ-komprimierte Einzelbilder aus dem Ausgangsmaterial. Alle Bildfehler/-störungen/-Profilirritationen etc. nimmst Du bei einer Konvertierung voll mit, verstärkst sie eventuell sogar und DU verlierst zwangsläufig weitere Details.

Die Frage ist, wie erstellen und da schau Dir die existierende Player an bis zu der Stelle, wo sie die berechneten Bilddaten an den Framebuffer rüberschubsen. Dort liegen die Bilder vollständig dekodiert vor, unabhängig vom Ausgangformat. Wenn Du sie dort abgreifst kannst Du jeglichen zusätzlichen(!!) Datenverlust vermeiden.

Warum das Rad neu erfinden?

Ansonsten benutze DV (Type 2), die Bilder sind ebenfalls einzeln komprimiert. Die dazugehörige Bibliothek als Codec müsste libdv sein. Die Ausgabe musst Du Dir dann selbst schreiben.
 
Wunderbar. Ich denke, das wird mir ordentlich weiter helfen.
 
Zurück
Oben