Este equipo de expertos pasados ciertos días de investigación y de recopilar de datos, obtuvieron los datos necesarios, esperamos que te sea útil en tu proyecto.
Solución:
Prueba esto. Está funcionando para mí (Windows 10).
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, descubrí que el tamaño de Writer debe coincidir con el tamaño del marco tanto de la cámara como de los archivos. 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))
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 true o no no he podido determinar, pero no he podido escribir a nada más.
Sin embargo, OpenCV es principalmente un visión por computador biblioteca, no una transmisión 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, incluido ffmpeg. También descargué e instalé XVID y openh264 de Cisco, que agregué a mi PATH. Estoy ejecutando Anaconda Python 3. También descargué una compilación reciente de ffmpeg y agregué la carpeta bin a mi ruta, aunque eso no debería marcar la diferencia ya que está integrado en OpenCV.
Estoy ejecutando en Win 10 de 64 bits.
Este código parece funcionar bien en mi computadora. Generará un video que contiene al azar static:
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 códec es lo importante.
Tenga cuidado al especificar los tamaños de los marcos. En el constructor, debe pasar el tamaño del marco como (columna, fila), por ejemplo, 640×480. Sin embargo, el
array que pasa, se indexa como (fila, columna). ¿Ves 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 imágenes de 8 bits, emita manualmente sus matrices si es necesario (.astype(‘uint8’))
- De hecho, no importa, solo siempre echa. Incluso si carga imágenes usando cv2.imread, debe convertir a uint8…
- MJPG fallará si no pasa una imagen de 3 canales y 8 bits. Obtengo un error de aserción para esto al menos.
- XVID también requiere una imagen de 3 canales, pero falla silenciosamente si no lo hace.
- H264 parece estar bien con una imagen de un solo canal
- Si necesita una salida sin procesar, por ejemplo, de 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 se guarda bien. 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 key el punto es que OpenCV no está diseñado para ser una biblioteca de captura de video, ni siquiera admite sonido. VideoWriter es útil, pero el 99 % de las veces es mejor guardar todas las imágenes en una carpeta y usar ffmpeg para convertirlas en un video útil.
Al final de la página puedes encontrar las observaciones de otros usuarios, tú de igual manera eres capaz mostrar el tuyo si lo crees conveniente.