开发者

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 = 开发者_JAVA技巧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!


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:

Writing video with OpenCV + Python + Mac

In Quicktime:

Writing video with OpenCV + Python + Mac


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.


This file in the OpenCV source implies on line #2598 - if this assert fails: "dst.data == dst0.data"

it means that the destination size or type was incorrect

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜