2012-05-15 15 views
14

Sto provando a creare un video dal wrapper python per OpenCV in OSX. Sto usando python 2.7.1, opencv 2.3.1a, e i wrapper python di willowgarage che vengono con quella versione di opencv. Ho:opencv VideoWriter sotto OSX non produce uscita

import cv,cv2 
w = cv2.VideoWriter('foo.avi', cv.FOURCC('M','J','P','G'), 25, (100,100)) 
for i in range(100): 
    w.write(np.ones((100,100,3), np.uint8)) 

OpenCV dice

WARNING: Could not create empty movie file container. 
Didn't successfully update movie file. 
... [ 100 repetitions] 

io non sono sicuro di cosa provare dopo

risposta

45

Ci sono molte guide online obsolete e scorrette su questo argomento-- Penso di aver provato quasi tutti. Dopo aver esaminato l'attuazione fonte QTKit a base di VideoWriter su Mac OSX, mi è stato finalmente in grado di ottenere VideoWriter di uscita file video validi utilizzando il seguente codice:

fps = 15 
capSize = (1028,720) # this is the size of my source video 
fourcc = cv2.cv.CV_FOURCC('m', 'p', '4', 'v') # note the lower case 
self.vout = cv2.VideoWriter() 
success = self.vout.open('output.mov',fourcc,fps,capSize,True) 

Per scrivere un frame di immagine (notare che l'imgFrame deve essere la stessa dimensione di capovolgimento sopra o aggiornamenti verranno a mancare):

self.vout.write(imgFrame) 

al termine assicurarsi di:

vout.release() 
self.vout = None 

Questo funziona per me su Mac OS X 10.8.5 (Mountain Lion): Nessuna garanzia su altre piattaforme. Spero che questo frammento risparmi altre ore di sperimentazione!

+5

Posso confermare che questo codice funziona su Mavericks, Python 2.7, openCV2 –

+1

Provato almeno altre cinque risposte SO prima di arrivare qui. Questo è l'unico che ha funzionato per me su Mavericks con Python 2.7 e OpenCV 2.4.6.1. –

+5

Stessa situazione degli altri commentatori. Ho scoperto che il fattore decisivo era l'uso dei caratteri minuscoli ''m', 'p', '4', 'v''. Molti altri esempi mostrano lettere maiuscole usate per 'fourcc', e non sapevo che fosse case-sensitive. –

1

Non è buona idea

È necessario creare un metodo VideoWriter struttura e l'uso WriteFrame :

import cv 
cv.NamedWindow('cap', 1) 
w = cv.CreateVideoWriter('test.avi',cv.CV_FOURCC('X','V','I','D'),25,(640,480)) 
cap = cv.CaptureFromCAM(0) 
while(1): 
    img = cv.QueryFrame(cap) 
    cv.ShowImage('cap', img) 
    cv.WriteFrame(w, img) 
    if cv.WaitKey(1) == 27: 
     break 
cv.DestroyWindow('cap') 
+0

Questa risposta sembra molto obsoleta ora. – JohnAllen

1

È possibile che la versione di ffmpeg non sia aggiornata. Ho riscontrato un problema simile con ffmpeg 0.8 e ha funzionato bene dopo l'aggiornamento a ffmpeg 0.11.

1

Ecco una variazione della risposta di @ ToddStellanova che ha funzionato per me:

def write_video(image_dir): 
    ''' 
    Writes a video from a set of images in `image_dir` 
    ''' 
    target = join('data/labelled-videos', 
       basename(image_dir) + '.mp4v') 
    codec = cv2.cv.CV_FOURCC('m', 'p', '4', 'v') 
    size = (256, 256) 
    v = cv2.VideoWriter(target, codec, 16, size) 
    for image_name in listdir(image_dir): 
    image_filename = join(image_dir, image_name) 
    arr = np.asarray(Image.open(image_filename)) 
    assert arr.shape[:2] == size 
    v.write(arr) 
1

Dopo aver provato varie opzioni, ho trovato che il frame.size che stavo usando non adattarsi alla dimensione specificata nel VideoWriter: Così impostandolo sul valore predefinito del mio iMac 1280x720 ha funzionato!

import numpy as np 
import cv2 

cap = cv2.VideoCapture(0) 

# Define the codec and create VideoWriter object 
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') 
out = cv2.VideoWriter() 
succes = out.open('output.mp4v',fourcc, 15.0, (1280,720),True) 
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() 
2

E 'il problema "dimensione".

import cv2 
import time 

filename = time.strftime("%m-%d-%H-%M-%S") + '.avi' 
fps = 16 

cap = cv2.VideoCapture(0) 

#in this way it always works, because your get the right "size" 
size = (int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)), 
     int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT))) 
fourcc = cv2.cv.FOURCC('8', 'B', 'P', 'S')  #works, large 
out = cv2.VideoWriter(filename, fourcc, fps, size, True) 

#in this way, you must set the "size" to your size, 
#because you don't know the default "size" is right or not 
#cap.set(3, 640) 
#cap.set(4, 480) 
#out = cv2.VideoWriter(filename, fourcc, fps, (640, 480), True) 

while(cap.isOpened()): 
    ret, frame = cap.read() 
    if ret == True: 
     out.write(frame) 
     cv2.imshow('frame', frame) 

    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break; 

else: 
    print 'Error...' 
    break; 

cap.release() 
out.release() 
cv2.destroyAllWindows() 
0

Grazie a @TeddStellanova

Qui XCode C++ Versione:

int fWidth = capture.get(CV_CAP_PROP_FRAME_WIDTH); 
int fHeight = capture.get(CV_CAP_PROP_FRAME_HEIGHT); 
string vid_path = path + "frames.mov"; 
VideoWriter vid(vid_path,CV_FOURCC('m','p','4','v'),30,Size(fWidth,fHeight),true); 
0

Ecco una versione che funziona con:

  • Python 3.6.3
  • OpenCV 3.3. 1
  • macOS 10.13.1

Installato con brew install opencv.

#!/usr/bin/env python3 

import cv2 

def main(): 
    vc = cv2.VideoCapture() 
    if not vc.open('input.mp4'): 
     print('failed to open video capture') 
     return 

    fourcc = cv2.VideoWriter_fourcc(*'mp4v') 
    # Match source video features. 
    fps = vc.get(cv2.CAP_PROP_FPS) 
    size = (
     int(vc.get(cv2.CAP_PROP_FRAME_WIDTH)), 
     int(vc.get(cv2.CAP_PROP_FRAME_HEIGHT)), 
    ) 

    vw = cv2.VideoWriter() 
    if not vw.open('output.mp4', fourcc, fps, size): 
     print('failed to open video writer') 
     return 

    while True: 
     ok, frame = vc.read() 
     if not ok: 
      break 

     # Flip upside down. 
     frame = cv2.flip(frame, 0) 

     # Write processed frame. 
     vw.write(frame) 

     cv2.imshow('frame', frame) 
     if cv2.waitKey(1) & 0xFF == ord('q'): 
      break 

    vc.release() 
    vw.release() 
    cv2.destroyAllWindows() 

if __name__ == "__main__": 
    main()