Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Writing video with OpenCV + Python + Mac

I keep getting an assertion error when I'm trying to write frames to video. The error I'm getting is this:

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

Here's my 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)

Saving the frames as images works fine so I know there's nothing wrong with the capture. Am I creating the writer wrong? The 'print fourcc' outputs 0.0 but I've tried with many FOUR_CC values.

Thanks!

like image 409
rgbrgb Avatar asked Mar 24 '11 23:03

rgbrgb


People also ask

Does OpenCV work on videos?

To start working with videos using OpenCV, we use the following functions: Cv2. VideoCapture() : It establishes a connection to a Video.It takes a parameter that indicates whether to use the built-in camera or an add-on camera. The value '0' denotes the built-in camera.

How do I save an output video in OpenCV Python?

With the cv2. VideoWriter() function, with the first parameter, we choose where the file will be saved and what its name will be, along with the type of file it will be. In this case, it will be an mp4 video file. If saving in the current working directory, you will simply specify the name and type of video file.

How do I store videos in OpenCV?

To save a video in OpenCV cv. VideoWriter() method is used.


2 Answers

Do some of your frames have different colorspaces or depths? A few observations:

  • You have swapped the height and width in your code, is that on purpose?
  • Your fourcc should be an integer > 0. See my example below.

I haven't personally generated Quicktime video using OpenCV, but this worked for me generating an uncompressed AVI file. I choose the I420 fourcc using the cv.CV_FOURCC function:

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)

Update: Screencapture of VLC playing out.avi:

enter image description here

In Quicktime:

enter image description here

like image 88
samplebias Avatar answered Sep 20 '22 12:09

samplebias


I tried various codecs including 'MJPG' and 'I420' and none of them worked on my Mac OpenCV build. They produced tiny unviewable output files without complaining.

Then I found this page which lists some codecs that worked for me. E.g. 'mp4v' works fine on my Mac and QuickTime is able to play it.

like image 35
mtoossi Avatar answered Sep 21 '22 12:09

mtoossi