Pregunta ¿Cómo procesar archivos de video con Python OpenCV más rápido que la velocidad de fotogramas del archivo?


Tengo un archivo de video que estoy tratando de procesar un cuadro a la vez. Intenté usar la clase VideoCapture para leer con el siguiente tipo de código. El problema es que si el archivo de video se graba a 25 cuadros / segundo, la lectura sucede al mismo ritmo. ¿Cómo puedo obtener marcos tan rápido como mi computadora puede decodificarlos?

Planeo procesar el flujo de video y luego almacenarlo en un archivo.

import cv2
import sys
import time

cap = cv2.VideoCapture(sys.argv[1])
start = time.time()

counter = 0
while True:
    counter += 1;
    image = cap.read()[1]
    if counter %25 == 0:
        print "time", time.time() - start

Salida: imprime una marca de tiempo una vez cada 25 fotogramas. Observe cómo las marcas de tiempo cambian casi exactamente 1 segundo en cada línea => el programa procesa unos 25 cuadros por segundo. Esto con un archivo de video que es de 25 cuadros / segundo.

time 1.25219297409
time 2.25236606598
time 3.25211691856
time 4.25237703323
time 5.25236296654
time 6.25234603882
time 7.252161026
time 8.25258207321
time 9.25195503235
time 10.2523479462

Probablemente VideoCapture es la API incorrecta para este tipo de trabajo, pero ¿qué usar en su lugar?

Usando Linux, Fedora 20, opencv-python 2.4.7 y python 2.7.5.


6
2018-01-29 20:46


origen


Respuestas:


Puedo reproducir el comportamiento que describes (es decir cv::VideoCapture >> image bloqueado a la velocidad de cuadro del video grabado) si se compila OpenCV sin apoyo ffmpeg. Si compilo opencv con Compatibilidad con ffmpeg, puedo leer imágenes de un archivo tan rápido como mi computadora lo permita. Creo que en ausencia de ffmpeg, opencv usa gstreamer y esencialmente trata el archivo de video como si estuviera reproduciendo una película.

Si está utilizando Linux, este enlace muestra qué paquetes debe instalar para obtener el soporte de ffmpeg para opencv.


6
2018-06-06 02:58



No he intentado esto todavía, pero creo que podría funcionar para archivos de video guardados en la máquina con una longitud finita (es decir, NO cámaras web en vivo). Solo un inconveniente previsible es que el algoritmo "puede" omitir los fotogramas si no se procesa lo suficientemente rápido, pero probablemente no leerá el siguiente fotograma. Creo que, en general, VideoCapture puede leer más lento que el FPS pero no puede leer más rápido. No me cites en eso, pero es algo que creo haber notado.

Utilizar el VideoCapture :: set () para cambiar el FPS a algo más rápido que el archivo en la computadora. El CV_CAP_PROP_FPS es lo que quiere cambiar.

Utilizar el VideoCapture :: get () Función para verificar que los fps fueron configurados correctamente.


0
2018-04-15 22:52