¿Cómo leer el video mp4 para ser procesado por scikit-image?

Me gustaría aplicar una scikit-image (específicamente la función match_template la plantilla) a los cuadros de un video mp4 , encoding h264 . Es importante para mi aplicación hacer un seguimiento del tiempo de cada cuadro, pero conozco la frecuencia de cuadros para poder calcular fácilmente a partir del número de cuadro.

Tenga en cuenta que me estoy quedando sin recursos, y me gustaría mantener las dependencias lo más pequeñas posible: de todos modos, se necesita numpy , y como planeo usar scikit-image , evitaría importar (y comstackr) openCV solo para leer el video.

Veo en la parte inferior de esta página que scikit-image puede procesar fácilmente el video almacenado como una matriz numpy , por lo que sería ideal.

Imageio python package debería hacer lo que quieras. Aquí hay un fragmento de python que usa este paquete:

 import pylab import imageio filename = '/tmp/file.mp4' vid = imageio.get_reader(filename, 'ffmpeg') nums = [10, 287] for num in nums: image = vid.get_data(num) fig = pylab.figure() fig.suptitle('image #{}'.format(num), fontsize=20) pylab.imshow(image) pylab.show() 

introduzca la descripción de la imagen aquíintroduzca la descripción de la imagen aquí

También puede iterar directamente sobre las imágenes en el archivo ( consulte la documentación ):

 for i, im in enumerate(vid): print('Mean of frame %i is %1.1f' % (i, im.mean())) 

Para instalar imageio puedes usar pip:

 pip install imageio 

Otra solución sería utilizar Moviepy (que usa un código similar para leer el video), pero creo que imageio es más ligero y hace el trabajo.


respuesta al primer comentario

Para verificar si la velocidad de cuadros nominal es la misma en todo el archivo, puede contar el número de cuadros en el iterador:

 count = 0 try: for _ in vid: count += 1 except RuntimeError: print('something went wront in iterating, maybee wrong fps number') finally: print('number of frames counted {}, number of frames in metada {}'.format(count, vid.get_meta_data()['nframes'])) In [10]: something went wront in iterating, maybee wrong fps number number of frames counted 454, number of frames in metada 461 

Para mostrar la marca de tiempo de cada cuadro:

 try: for num, image in enumerate(vid.iter_data()): if num % int(vid._meta['fps']): continue else: fig = pylab.figure() pylab.imshow(image) timestamp = float(num)/ vid.get_meta_data()['fps'] print(timestamp) fig.suptitle('image #{}, timestamp={}'.format(num, timestamp), fontsize=20) pylab.show() except RuntimeError: print('something went wrong') 

Podrías usar scikit-video , así:

 from skvideo.io import VideoCapture cap = VideoCapture(filename) cap.open() while True: retval, image = cap.read() # image is a numpy array containing the next frame # do something with image here if not retval: break 

Esto utiliza avconv o ffmpeg debajo del capó. El rendimiento es bastante bueno, con una pequeña sobrecarga para mover los datos a python en comparación con solo descifrar el video en avconv.

La ventaja de scikit-video es que la API es exactamente la misma que la API de lectura / escritura de video de OpenCV; simplemente reemplace cv2.VideoCapture con skvideo.io.VideoCapture.

Una forma fácil de leer video en python es usando skviode. Un solo código de línea puede ayudar a leer el video completo.

 import skvideo.io videodata = skvideo.io.vread("video_file_name") print(videodata.shape) 

http://mllearners.blogspot.in/2018/01/scikit-video-skvideo-tutorial-for.html