当我尝试将帧写入视频时,我不断收到断言错误。我得到的错误是:
Traceback (most recent call last):
File "VideoMixer.py", line 23, in <module>
cv.WriteFrame(writer, cv.LoadImage(fileName))
cv.error: dst.data == dst0.data
这是我的剧本:
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)
保存帧作为图像工作正常,所以我知道捕获没有错。我创作的作者错了吗? 'print fourcc'输出0.0,但我尝试了很多FOUR_CC值。
谢谢!
答案 0 :(得分:6)
您的某些相框是否有不同的色彩空间或深度?一些观察结果:
fourcc
应为整数&gt; 0.见下面的例子。我没有亲自使用OpenCV生成Quicktime视频,但这对我生成了一个未压缩的AVI文件。我使用cv.CV_FOURCC
函数选择I420 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)
更新:VLC播放的屏幕截图out.avi
:
在Quicktime中:
答案 1 :(得分:4)
我尝试了各种编解码器,包括'MJPG'和'I420',但我的Mac OpenCV版本都没有。他们制作了微小的无法观看的输出文件而没有抱怨。
然后我发现this page列出了一些对我有用的编解码器。例如。 'mp4v'在我的Mac上工作正常,QuickTime可以播放它。
答案 2 :(得分:0)
This file in the OpenCV source暗示在第2598行 - 如果此断言失败:“dst.data == dst0.data”
表示目的地大小或类型不正确