Reverse-video-Wiedergabe in OpenCV
Ist es möglich, die Wiedergabe von videos rückwärts in OpenCV?
Entweder durch einen API-Aufruf oder durch die Pufferung von video-frames und die Umkehrung der Reihenfolge, in
eine neue video-Datei.
Dank
InformationsquelleAutor darasan | 2012-06-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der einzige praktische Weg, es zu tun ist manuell zu extrahieren frames, buffer ( Arbeitsspeicher oder Dateien), dann laden Sie Sie in umgekehrter Reihenfolge.
Das problem ist, dass die video-Kompressoren sind alle Ausnutzung von Zeit-Redundanz - die Tatsache, dass zwei aufeinanderfolgende frames sind die meiste Zeit sehr ähnlich. So, Sie Kodieren, einen full-frame von Zeit zu Zeit (in der Regel alle paar hundert frames) und dann nur senden Sie die Unterschiede zwischen der früheren und der aktuellen.
Nun für die Decodierung funktioniert, muss es getan werden in der gleichen Reihenfolge - decodieren einen keyframe (eine volle), dann wird für jedes neue frame, fügen Unterschiede erhalten Sie das aktuelle Bild.
Diese Strategie macht es sehr schwer zu reverse-play video -. Es gibt mehrere Techniken, aber alle beinhalten die Pufferung.
Nun, Sie haben vielleicht schon die CV_CAP_PROP_POS_FRAMES Parameter, beschrieben von Astor. Es scheint ok, aber wegen der Probleme, die oben beschrieben, OpenCV ist nicht in der Lage, richtig springen zu einem bestimmten Bild (es gibt mehrere bugs, die offen über diese Themen). Sie (OpenCV devs) arbeiten auf einige Lösungen, aber auch die wird sehr langsam sein (Sie beinhalten gehen zurück zum vorherigen keyframe, dann wird die Decodierung zurück auf die ausgewählten). Wenn Sie diese Technik verwenden, ist jedes Bild ausgewertet werden muss Hunderte Male über dem Durchschnitt, so dass es sehr langsam. Und doch, es funktioniert nicht.
Bearbeiten
Wenn Sie verfolgen die Puffer Weg, um es rückgängig zu machen, im Hinterkopf behalten, dass eine decodierte video wird schnell ein Essen aus dem Speicher-Ressourcen von einem normalen computer. Eine übliche 720p video eine minute lang muss 4,7 GB der Speicher bei dekomprimiert! Speichern von frames als einzelne Dateien auf der Festplatte ist eine praktische Lösung für dieses problem.
🙂 nicht yey, ich bin zwar denken einige patches. Aber ich habe einige Probleme mit der Videoergreifung syncronization, und ich entdeckte einige seiner Schwächen.
OK, danke für Eure Hilfe
InformationsquelleAutor Sam
Andere Lösung, ähnlich ArtemStorozhuk Antwort ist die Verwendung der FPS zu bewegen aus dem Rahmen-Domäne in der time-domain, dann suchen Sie rückwärts mit
CV_CAP_PROP_POS_MSEC
(was nicht hammer die CPU wieCV_CAP_PROP_POS_FRAMES
können). Hier ist mein Beispiel code, der perfekt funktioniert auf eine .mpg, mit nur etwa 50% CPU.Ich denke, es hat zu tun mit der Art, wie videos codiert werden... es gibt einen Zeitstempel in jedem Paket, mit Angabe der Zeit, die seit dem start der video -, so sucht zu einer bestimmten Zeit im video wird eine einfache binäre Suche Betrieb. Aber ich bin kein Experte für video-Kodierungen, so nehmen Sie diesen Kommentar mit einem Körnchen Salz.
InformationsquelleAutor Trebor Rude
Ja, es ist möglich. Siehe code-Kommentare:
Lesen Sie auch diese Artikel.
InformationsquelleAutor ArtemStorozhuk