在Mac上使用OpenCV和Python写视频

8 投票
3 回答
16026 浏览
提问于 2025-04-16 14:22

我在尝试把画面写入视频时,总是遇到一个断言错误。这个错误是这样的:

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 值。

谢谢!

3 个回答

0

在OpenCV的源代码中,这个文件提到在第2598行 - 如果这个检查失败了:“dst.data == dst0.data”

这意味着目标的大小或类型不正确

5

我尝试了很多种编码格式,比如'MJPG'和'I420',但是在我的Mac上用OpenCV时都没能成功。这些编码格式生成的文件非常小,根本无法查看,而且也没有任何错误提示。

后来我找到了这个页面,上面列出了一些对我有用的编码格式。例如,'mp4v'在我的Mac上运行得很好,QuickTime也能播放这个格式。

6

你的一些帧可能有不同的颜色空间或深度吗?这里有几点观察:

  • 你的代码中高度和宽度是不是搞反了?这是故意的吗?
  • 你的 fourcc 应该是一个大于0的整数。看看我下面的例子。

我个人没有用OpenCV生成Quicktime视频,但我用它生成无压缩的AVI文件时,这个方法是有效的。我选择了I420的fourcc,使用了 cv.CV_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中:

在这里输入图片描述

撰写回答