Lesen jedes n-ten Frames von VideoCapture in OpenCV

8

Ist es möglich, Frames aus einem Video in Schritten zu lesen (zB möchte ich jeden fünften Frame eines Videostreams lesen). Derzeit mache ich das als Workaround, aber es ist nicht sehr effektiv.

%Vor%

Irgendwelche Vorschläge, so dass ich nicht durch die fünf Frames gehen muss, um den gewünschten Frame zu erhalten?

    
user3079474 28.03.2014, 05:33
quelle

3 Antworten

8

Ich fürchte, es gibt nicht viel, was Sie tun können, und es ist nicht nur ein Manko von OpenCV. Sie sehen, moderne Video-Codecs, sind in der Regel komplexe Bestien. Um eine höhere Komprimierungsrate zu erhalten, hängt die Codierung eines Frames oft von vorherigen und manchmal sogar aufeinanderfolgenden Frames ab.

Die meiste Zeit müssen Sie also Frames vor dem gewünschten dekodieren, auch wenn Sie sie nicht brauchen.

Es gibt eher nicht-triviale Tricks, um eine Videodatei spezifisch zu kodieren, so dass es billig wäre, jedes N-te Bild zu erhalten, aber im Allgemeinen ist es nicht machbar.

Das heißt, Sie können die Suchfunktionalität versuchen, die OpenCV bietet (siehe OpenCV-Suchfunktion / Zurückspulen ). Es kann (je nach Umständen) auch schneller arbeiten. Persönlich würde ich jedoch nicht darauf wetten.

    
Sergei Nosov 28.03.2014, 07:24
quelle
4

Ich habe es in Python arbeiten lassen ... Siehe unten für zwei Anwendungsbeispiele und einige Einschränkungen.

Importieren Sie zuerst einige Pakete

%Vor%

Erfassen Sie alle n Sekunden (hier, n = 5)

%Vor%

Alternativ erfassen Sie alle n Frames (hier n = 10)

%Vor%

Das ist es ziemlich.

Einige unglückliche Vorbehalte ... abhängig von Ihrer Version von opencv (dies ist für opencv V3 gebaut), müssen Sie die fps-Variable möglicherweise anders einstellen. Siehe hier für Details. Um Ihre Version herauszufinden, können Sie Folgendes tun: %Vor%     
Afflatus 30.04.2016 23:37
quelle
1

Hier ist was ich vorschlage:

%Vor%

Nachdem Sie alle Bilder lokal gespeichert haben, können Sie schnell das gewünschte n-te Bild lesen.
CATUION : Ein Beispielvideo von 12 Sekunden, das ich hatte, bestand aus & gt; 200 Bildern . Das wird viel Platz verbrauchen.

Eine einfache, aber effektive Optimierung besteht darin, den n-ten Frame mit dem von Ihnen verwendeten Ansatz oder dem von @sergie vorgeschlagenen zu lesen. Danach können Sie das Bild mit seinem Index speichern, so dass eine spätere Abfrage bei gleichem Index das gespeicherte Bild zurückgibt, anstatt Frames wie Sie überspringen zu müssen. Auf diese Weise sparen Sie den Platz, den Sie beim Speichern von Bildern verschwendet hätten, die Sie nicht abgefragt hätten, und die Zeit, die Sie zum Lesen von & amp; Speichern Sie auch diese unerwünschten Frames.

    
Deepthought 10.07.2014 19:17
quelle

Tags und Links