video openCV guardando en python

Estoy tratando de guardar el video pero no funciona. Seguí las instrucciones de la documentación de openCV.

import numpy as np import cv2 cap = cv2.VideoCapture(0) fourcc = cv2.VideoWriter_fourcc(*'XVID') out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640,480)) while(cap.isOpened()): ret, frame = cap.read() if ret==True: frame = cv2.flip(frame,0) out.write(frame) cv2.imshow('frame',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break else: break cap.release() out.release() cv2.destroyAllWindows() 

¿Qué está mal?

prueba esto . esta funcionando para mi

 import numpy as np import cv2 cap = cv2.VideoCapture(0) # Define the codec and create VideoWriter object #fourcc = cv2.cv.CV_FOURCC(*'DIVX') #out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480)) out = cv2.VideoWriter('output.avi', -1, 20.0, (640,480)) while(cap.isOpened()): ret, frame = cap.read() if ret==True: frame = cv2.flip(frame,0) # write the flipped frame out.write(frame) cv2.imshow('frame',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break else: break # Release everything if job is finished cap.release() out.release() cv2.destroyAllWindows() 

En mi caso, encontré que el tamaño de Writer debe coincidir con el tamaño de marco tanto de la cámara como de los archivos. De modo que primero leo el tamaño del marco y lo aplico a la configuración del escritor como se muestra a continuación.

 (grabbed, frame) = camera.read() fshape = frame.shape fheight = fshape[0] fwidth = fshape[1] print fwidth , fheight fourcc = cv2.VideoWriter_fourcc(*'XVID') out = cv2.VideoWriter('output.avi',fourcc, 20.0, (fwidth,fheight)) 

También tuve el mismo problema pero funcionó cuando usé ‘MJPG’ en lugar de ‘XVID’

solía

 fourcc = cv2.VideoWriter_fourcc(*'MJPG') 

en lugar de

 fourcc = cv2.VideoWriter_fourcc(*'XVID') 

Tuve el mismo problema y luego probé esto:

 frame = cv2.flip(frame,180) 

en lugar de

 frame= cv2.flip(frame,0) 

y esta funcionando

jveitchmichaelis en https://github.com/ContinuumIO/anaconda-issues/issues/223 proporcionó una respuesta completa. Aquí copié su respuesta:

La documentación en OpenCV dice (oculta) que solo puede escribir en avi usando OpenCV3. Si eso es cierto o no, no he podido determinarlo, pero no he podido escribir en otra cosa.

Sin embargo, OpenCV es principalmente una biblioteca de visión artificial, no un flujo de video, códec y escritura. Por lo tanto, los desarrolladores intentaron mantener esta parte lo más simple posible. Debido a esto, OpenCV para contenedores de video solo admite la extensión avi, su primera versión.

De: http://docs.opencv.org/3.1.0/d7/d9e/tutorial_video_write.html

Mi configuración: construí OpenCV 3 desde la fuente usando MSVC 2015, incluyendo ffmpeg. También descargué e instalé XVID y openh264 de Cisco, que agregué a mi RUTA. Estoy ejecutando Anaconda Python 3. También descargué una comstackción reciente de ffmpeg y agregué la carpeta bin a mi ruta, aunque eso no debería hacer una diferencia, ya que está integrado en OpenCV.

Estoy corriendo en Win 10 de 64 bits.

Este código parece funcionar bien en mi computadora. Se generará un video que contiene estática aleatoria:

 writer = cv2.VideoWriter("output.avi", cv2.VideoWriter_fourcc(*"MJPG"), 30,(640,480)) for frame in range(1000): writer.write(np.random.randint(0, 255, (480,640,3)).astype('uint8')) writer.release() 

Algunas cosas que he aprendido a través de prueba y error:

  • Solo use ‘.avi’, es solo un contenedor, el codec es lo importante.
  • Tenga cuidado al especificar el tamaño de los marcos. En el constructor, debe pasar el tamaño del marco como (columna, fila), por ejemplo, 640×480. Sin embargo, la matriz que se pasa, se indexa como (fila, columna). Vea en el ejemplo anterior cómo se cambia?

  • Si su imagen de entrada tiene un tamaño diferente al VideoWriter, fallará (a menudo en silencio)

  • Solo pase en imágenes de 8 bits, emita manualmente sus arreglos si tiene que hacerlo (.astype (‘uint8’))
  • De hecho, no importa, siempre elenco. Incluso si carga imágenes con cv2.imread, debe convertir a uint8 …
  • MJPG fallará si no pasa una imagen de 3 canales y 8 bits. Me sale un fallo de afirmación al menos por esto.
  • XVID también requiere una imagen de 3 canales, pero falla silenciosamente si no haces esto.
  • H264 parece estar bien con una sola imagen de canal
  • Si necesita una salida en bruto, digamos desde una cámara de visión artificial, puede usar ‘DIB’. ‘RAW’ o un códec vacío a veces funciona. Curiosamente, si uso DIB, aparece un error de ffmpeg, pero el video está bien guardado. Si uso RAW, no hay ningún error, pero el reproductor de Windows Video no lo abre. Todos están bien en VLC.

Al final, creo que el punto clave es que OpenCV no está diseñado para ser una biblioteca de captura de video, ni siquiera es compatible con el sonido. VideoWriter es útil, pero el 99% del tiempo es mejor guardar todas las imágenes en una carpeta y usar ffmpeg para convertirlas en un video útil.

La respuesta de Nuru realmente funciona, lo único es eliminar esta línea frame = cv2.flip(frame,0) debajo de if ret==True: loop que producirá el archivo de video sin voltearlo

Como ejemplo :

 fourcc = cv2.VideoWriter_fourcc(*'MJPG') out_corner = cv2.VideoWriter('img_corner_1.avi',fourcc, 20.0, (640, 480)) 

En ese lugar, hay que definir X, Y como ancho y alto.

Pero, cuando creas una imagen (una imagen en blanco por ejemplo) tienes que definir Y, X como alto y ancho:

  img_corner = np.zeros((480, 640, 3), np.uint8) 

Como dijo @ ปรีดา ตั้ง น ภากร: los tamaños de Writer deben coincidir con el marco de la cámara o los archivos.

Puede usar dicho código para verificar si su cámara es (640, 480) o no:

 print(int(cap.get(3)), int(cap.get(4))) 

Por mi parte, encontré que mi cámara es (1280, 720) y la reemplacé (640, 480) por (1280, 720). Entonces puede guardar videos.

Por favor, asegúrese de establecer el ancho y la altura correcta. Puedes configurarlo como abajo.

 cv2.VideoWriter('output.avi', fourcc, 20.0, (int(cap.get(3)), int(cap.get(4)))) 

Esta es una respuesta que solo se probó en MacOS, pero probablemente también funcionará en Linux y Windows.

 import numpy as np import cv2 cap = cv2.VideoCapture(0) # Get the Default resolutions frame_width = int(cap.get(3)) frame_height = int(cap.get(4)) # Define the codec and filename. out = cv2.VideoWriter('output.avi',cv2.VideoWriter_fourcc('M','J','P','G'), 10, (frame_width,frame_height)) while(cap.isOpened()): ret, frame = cap.read() if ret==True: # write the frame out.write(frame) cv2.imshow('frame',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break else: break # Release everything if job is finished cap.release() out.release() cv2.destroyAllWindows()