2011-03-24 22 views
6

Continuo a ricevere un errore di asserzione quando sto provando a scrivere fotogrammi sul video. L'errore che sto ricevendo è questa:Scrittura di 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 

Ecco il mio 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) 

Salvare i fotogrammi come immagini funziona bene quindi so che non c'è niente di sbagliato con la cattura. Sto creando uno scrittore sbagliato? Le uscite 'print fourcc' 0.0 ma ho provato con molti valori di FOUR_CC.

Grazie!

risposta

6

Alcuni fotogrammi hanno spazi di colori o profondità diversi? Qualche osservazione:

  • Hai scambiato l'altezza e la larghezza nel tuo codice, è quello di proposito?
  • Il tuo fourcc dovrebbe essere un numero intero> 0. Vedere il mio esempio di seguito.

non ho generato personalmente video QuickTime utilizzando OpenCV, ma questo ha funzionato per me la generazione di un file AVI non compresso. Scelgo il fourcc I420 utilizzando la funzione 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) 

Aggiornamento: ScreenCapture di VLC giocare out.avi:

enter image description here

in QuickTime:

enter image description here

+2

Grazie mille ma sei in grado di suonare l'out.avi? Lo script funziona bene per me e crea il file, ma VLC mi dà un errore quando provo a riprodurlo: errore ps: non posso sbirciare il debug principale di : non è possibile caricare il modulo demux corrispondente "avi" debug principale: TIMER module_need() : 303.765 ms - Totale 303.765 ms/1 intvls (Avg 303.765 ms) errore principale: nessun modulo di demux adatto per 'file /: ///Users/***/Documents/Code/Video/out.avi ' – rgbrgb

+0

Posso riprodurre il file, sto usando l'ultimo VLC su Mac. Aggiornerò la mia risposta con uno screencap. – samplebias

+0

Sono stato anche in grado di aprire e riprodurre il file out.avi utilizzando [AviDemux] (http://avidemux.sourceforge.net/) e Quicktime. – samplebias

4

ho provato vari codec tra cui 'MJPG' e 'I420' e nessuno di loro ha lavorato sul mio Mac OpenCV costruire. Hanno prodotto minuscoli file di output non visualizzabili senza lamentarsi.

Quindi ho trovato this page che elenca alcuni codec che hanno funzionato per me. Per esempio. 'mp4v' funziona bene sul mio Mac e QuickTime è in grado di riprodurlo.

+1

@mtoosi, quale estensione di file hai salvato come file? Ho provato 'codec = cv.CV_FOURCC ('M', 'P', '4', 'V')' e salvando il file come '/ full/path/to/file/out.mp4v' che ha prodotto un file valido, ma non uno che si apre in QuickTime o VLC. – cooncesean

+0

@cooncesean, ho usato '.avi' come estensione di file in tutti i casi IIRC. Inoltre, ero su OS X 10.8 e ho creato OpenCV 2.4.3 da solo con tutti i flag di default e nessuna libreria di terze parti installata sul sistema. – mtoossi

+0

FYI Sono su OS X 10.11 con OpenCV 2.4.13.2, e sono riuscito a farlo funzionare con 'cv2.cv.CV_FOURCC ('M', 'P', '4', 'V')' e un nome file di output con estensione '.avi'. Un'estensione di '.mp4' ha prodotto un video con un singolo fotogramma e nessun movimento. – trianta2

Problemi correlati