2011-03-24 18 views
6

Recibo un error de afirmación cuando intento escribir marcos en el video. El error que estoy recibiendo es la siguiente:Grabación de video con OpenCV + Python + Mac

Traceback (most recent call last): 
    File "VideoMixer.py", line 23, in <module> 
    cv.WriteFrame(writer, cv.LoadImage(fileName)) 
cv.error: dst.data == dst0.data 

Aquí está mi script:

import cv 
import sys 

files = sys.argv[1:] 

for f in files: 
    capture = cv.CaptureFromFile(f) 
    height = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH) 
    width = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT) 
    fps = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FPS) 
    fourcc = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FOURCC) 
    print fourcc 
    writer = cv.CreateVideoWriter('ok.mov', int(fourcc),fps,(int(width),int(height)),1) 
    print writer 
    for i in range(30): 
     frame = cv.QueryFrame(capture) 
     print frame 
     if frame: 
      cv.WriteFrame(writer, frame) 

Aseguramiento de los marcos en forma de imágenes funciona bien, así que sé que no hay nada malo con la captura. ¿Estoy equivocando al escritor? El 'print fourcc' da como resultado 0.0 pero he intentado con muchos valores FOUR_CC.

Gracias!

Respuesta

6

¿Algunos de sus marcos tienen diferentes espacios de colores o profundidades? Algunas observaciones:

  • Has cambiado el alto y el ancho en tu código, ¿es eso a propósito?
  • Su fourcc debe ser un número entero> 0. Consulte mi ejemplo a continuación.

No he generado personalmente video Quicktime usando OpenCV, pero esto funcionó para mí al generar un archivo AVI sin comprimir. Elijo el fourcc I420 usando la función cv.CV_FOURCC:

import cv 
import sys 

# standard RGB png file 
path = 'stack.png' 
cap = cv.CaptureFromFile(path) 
fps = 24 
width = int(cv.GetCaptureProperty(cap, cv.CV_CAP_PROP_FRAME_WIDTH)) 
height = int(cv.GetCaptureProperty(cap, cv.CV_CAP_PROP_FRAME_HEIGHT)) 
# uncompressed YUV 4:2:0 chroma subsampled 
fourcc = cv.CV_FOURCC('I','4','2','0') 
writer = cv.CreateVideoWriter('out.avi', fourcc, fps, (width, height), 1) 
for i in range(90): 
    cv.GrabFrame(cap) 
    frame = cv.RetrieveFrame(cap) 
    cv.WriteFrame(writer, frame) 

actualización: ScreenCapture de VLC juega out.avi:

enter image description here

en QuickTime:

enter image description here

+2

Muchas gracias, pero ¿puedes jugar el out.avi? La secuencia de comandos funciona bien para mí y crea el archivo, pero VLC me da un error cuando intento reproducirlo: ps error: no se puede ojear depuración principal: no se pudo cargar el módulo de demultiplexación "avi" depuración principal: TIMER module_need() : 303.765 ms - Total 303.765 ms/1 intvls (Avg 303.765 ms) error principal: no hay módulo demux adecuado para 'file /: ///Users/***/Documents/Code/Video/out.avi ' – rgbrgb

+0

Puedo reproducir el archivo, estoy usando el último VLC en Mac. Actualizaré mi respuesta con un screencap. – samplebias

+0

También pude abrir y reproducir el archivo out.avi usando [AviDemux] (http://avidemux.sourceforge.net/) y Quicktime. – samplebias

4

Probé varios codecs incluidos 'MJPG' y 'I420' y ninguno de ellos trabajó en mi Mac OpenCV construir. Produjeron pequeños archivos de salida no visibles sin quejarse.

Luego encontré this page que enumera algunos códecs que me funcionaron. P.ej. 'mp4v' funciona bien en mi Mac y QuickTime es capaz de reproducirlo.

+1

@mtoosi, ¿con qué extensión de archivo guardó su archivo? Intenté 'codec = cv.CV_FOURCC ('M', 'P', '4', 'V')' y guardo el archivo como '/ full/path/to/file/out.mp4v' que produjo un archivo válido, pero no uno que se abre en QuickTime o VLC. – cooncesean

+0

@cooncesean, utilicé '.avi' como extensión de archivo en todos los casos IIRC. Además, estaba en OS X 10.8 y construí OpenCV 2.4.3 yo mismo con todos los indicadores predeterminados y no hay bibliotecas de terceros instaladas en el sistema. – mtoossi

+0

FYI Estoy en OS X 10.11 con OpenCV 2.4.13.2, y pude hacer que esto funcione con 'cv2.cv.CV_FOURCC ('M', 'P', '4', 'V')' y un nombre de archivo de salida con extensión '.avi'. Una extensión de '.mp4' produjo un video con un solo cuadro y sin movimiento. – trianta2

Cuestiones relacionadas