使用cv2 VideoWriter写入numpy数组

12

我在使用opencv2.3.1的VideoWriter编写玩具示例视频时遇到了问题,以下是我的代码:

writer = cv2.VideoWriter('test1.avi',cv.CV_FOURCC('P','I','M','1'),25,(640,480))
for i in range(1000):
    x = np.random.randint(10,size=(480,640)).astype('uint8')
    writer.write(x)
#del writer (with or without tested)
我尝试了各种可能的组合,如果扩展名是mpg,则结果为0字节文件;如果扩展名是avi,则结果为5.5kb。一些人指出我应该从源代码中构建ffmpeg库而不是apt-get获取它。好吧,我在一个全新的机器上按照这个网站的帮助进行了操作http://vinayhacks.blogspot.com/2011/11/installing-opencv-231-with-ffmpeg-on-64.html。虽然这个网站也在编译opencv时出现了错误(错误与ffmpeg有关),但我还是这样做了。现在我真的没有更多的想法了,如何使用OPENCV生成视频?
谢谢提前。

如果由于某种原因 cv2.VideoWriter() 失败,writer 将为 nil。在执行循环之前测试一下怎么样? - karlphillip
当我写writer.isOpened时,它返回True,因此我认为它不是None。 - JustInTime
我并不是在说这是必须的,我只是认为这是一个好习惯,并且它会保护你免受未来很多麻烦的困扰。 - karlphillip
3个回答

11

VideoWriter有最后一个参数isColor,默认值为True。 因此,如果您将其更改为False,则可以编写您的2D数组。

import cv2
import numpy as np

writer = cv2.VideoWriter('test1.avi', cv2.VideoWriter_fourcc(*'PIM1'), 25, (640, 480), False)
for i in range(100):
    x = np.random.randint(255, size=(480, 640)).astype('uint8')
    writer.write(x)

有没有想法如何将3D numpy数组写成视频? - Ernest S Kirubakaran

4

你好,我是opencv的新手,遇到了同样的问题。看起来writer.write(x)需要把x作为一个带有RGB值的数组,而不是标量。我通过以下方式解决了这个问题:

import cv2
import cv2.cv as cv
import numpy as np

writer = cv2.VideoWriter('test1.avi',cv.CV_FOURCC('P','I','M','1'),25,(640,480))
for i in range(1000):
    x = np.random.randint(255,size=(480,640)).astype('uint8')
    x = np.repeat(x,3,axis=1)
    x = x.reshape(480, 640, 3)
    writer.write(x)

我假设有更加简洁的方法,但是我还没有找到。

10
顺便提一句(这样未来的我就不会再浪费时间了),OpenCV 需要(宽度,高度)的顺序,但是 NumPy 数组需要(高度,宽度)的顺序。所以在 VideoWriter 中需要使用 640、480,但在 NumPy 中需要使用 480、640。如果尺寸不匹配,VideoWriter 将会默默地失败。 - otterb

1
你使用的是哪个操作系统?你确定你的系统已经安装了PIM1编解码器吗?
我使用的是Windows,我可以使用cv.FOURCC(*"DIB ")来进行无损视频编码,或者使用-1来显示编解码器对话框。
安装了ffdshow之后,我可以使用cv.FOURCC(*"ffds")来进行MPEG-4视频编码。

我正在运行Ubuntu 10.04,已经尝试使用-1,但它为我呈现了这个错误消息:错误:(-210)Gstreamer Opencv后端实际上不支持此编解码器。在函数CvVideoWriter_GStreamer :: open中。 - JustInTime

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接