2012-05-15 15 views
14

Ich versuche, ein Video aus dem Python-Wrapper für OpenCV unter OSX zu erstellen. Ich benutze Python 2.7.1, opencv 2.3.1a und die Python-Wrapper von Willowgarage, die mit dieser Version von opencv kommen. Ich habe:opencv VideoWriter unter OSX produziert keine Ausgabe

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 sagt

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

Ich bin nicht sicher, was als nächstes

Antwort

45

Es gibt viele veraltete und falsche Online-Anleitungen zu diesem Thema-- Ich glaube, ich habe fast jeden ausprobiert. Nach einem Blick auf der Quelle QTKit-basierte Implementierung von VideoWriter auf Mac OSX, war ich endlich in der Lage VideoWriter zur Ausgabe von gültigen Videodateien zu erhalten mit dem folgenden Code:

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) 

einen Bildrahmen zu schreiben (beachten Sie, dass die imgFrame muss sein, um die gleiche Größe wie kentern oben oder Updates fehl):

self.vout.write(imgFrame) 

Wenn sicher sein getan:

vout.release() 
self.vout = None 

Dies funktioniert für mich auf Mac OS X 10.8.5 (Mountain Lion): Keine Garantien über andere Plattformen. Ich hoffe, dass dieses Schnipsel jemand anderen Stunden des Experimentierens erspart!

+5

Ich kann bestätigen, dass dieser Code auf Mavericks, Python 2.7, openCV2 funktioniert –

+1

Mindestens fünf weitere SO Antworten versucht, bevor Sie hier ankommen. Dies ist der einzige, der bei Mavericks mit Python 2.7 und OpenCV 2.4.6.1 für mich funktioniert hat. –

+5

Gleiche Situation wie die anderen Kommentatoren. Ich fand den entscheidenden Faktor in der Verwendung von Kleinbuchstaben "m", "p", "4", "v". Viele andere Beispiele zeigen Großbuchstaben, die für 'fourcc' verwendet werden, und ich wusste nicht, dass zwischen Groß- und Kleinschreibung unterschieden wird. –

1

Es ist nicht gute Idee

Sie versuchen müssen eine VideoWriter Struktur und die Verwendung Methode erstellen 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

Diese Antwort scheint jetzt sehr veraltet. – JohnAllen

1

Es ist möglich, dass Ihre Version von ffmpeg veraltet ist. Ich stieß auf ein ähnliches Problem mit ffmpeg 0.8 und es funktionierte gut, nachdem ich auf ffmpeg 0.11 aufgerüstet habe.

1

Hier ist eine Variation der Antwort des @ ToddStellanova die für mich gearbeitet:

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

Nach verschiedenen Optionen versuchen, fand ich, dass die frame.size, dass ich die Größe in der VideoWriter angegebenen paßten nicht wurde mit: So Wenn ich es auf den Standard meines iMac 1280x720 setze, haben die Dinge funktioniert!

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

Es ist das "Größe" -Problem.

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

Dank @TeddStellanova

Hier XCode C++ Version:

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

Hier ist eine Version, die mit arbeitet: 3.6.3

  • OpenCV 3,3

    • Python. 1
    • macOS 10.13.1

    Installiert mit 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()