Tengo un script de python en la misma carpeta que un video que quiero convertir en una matriz numpy. Mi video se llama 'test.mp4'.
Dentro de mi secuencia de comandos, quiero llamar a someFunction('test.mp4') y obtener una matriz numpy. La matriz numpy resultante debe ser una matriz numpy de imágenes, donde cada imagen es una matriz numpy tridimensional.
¿Tiene sentido?
¡Gracias!
skvideo es un paquete de python que se puede usar para leer videos y almacenarlos en la matriz multidimensional.
import skvideo.io videodata = skvideo.io.vread("video_file_name") print(videodata.shape)Para más detalles: http://www.scikit-video.org/stable/index.html y http://mllearners.blogspot.in/2018/01/scikit-video-skvideo-tutorial-for.html
El siguiente script hace lo que quieres. Puede separar parte de él en la función.
El código a continuación no verifica errores, en particular, el código de producción verificará que cada variable de frame* sea mayor que cero.
import cv2 import numpy as np cap = cv2.VideoCapture('test.mp4') frameCount = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) frameWidth = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frameHeight = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) buf = np.empty((frameCount, frameHeight, frameWidth, 3), np.dtype('uint8')) fc = 0 ret = True while (fc < frameCount and ret): ret, buf[fc] = cap.read() fc += 1 cap.release() cv2.namedWindow('frame 10') cv2.imshow('frame 10', buf[9]) cv2.waitKey(0)Cuando miramos el video desde la perspectiva del procesamiento de imágenes, podemos asumir que es una secuencia de imágenes. Desde este punto, puede recorrer los fotogramas de su video y convertirlos en una matriz numpy .
Aquí hay un ejemplo con las bibliotecas Pillow y OpenCV , donde estoy convirtiendo las capturas de pantalla de mi cámara web en matrices numpy :
import cv2 import numpy as np from PIL import Image, ImageOps def screenshot(): global cam cv2.imwrite('screenshot.png', cam.read()[1]) if __name__ == '__main__': np.set_printoptions(suppress=True) cam = cv2.VideoCapture(0) # You can replace it with your video path while True: ret, img = cam.read() cv2.imshow('My Camera', img) ch = cv2.waitKey(5) if ch == 27: break screenshot() data = np.ndarray(shape=(1, 224, 224, 3), dtype=np.float32) image = Image.open('screenshot.png') size = (224, 224) # Put your suitable size image = ImageOps.fit(image, size, Image.ANTIALIAS) image_array = np.asarray(image) # Here, an image -> numpy array print(image_array) cv2.destroyAllWindows()