使用 cv2 VideoWriter 编写 numpy 数组

Posted

技术标签:

【中文标题】使用 cv2 VideoWriter 编写 numpy 数组【英文标题】:Writing numpy arrays using cv2 VideoWriter 【发布时间】:2012-03-06 01:02:18 【问题描述】:

我在使用 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 将为零。在执行循环之前测试一下怎么样? 当我写 writer.isOpened 它为我返回 True,因此我认为它不是 None 我不是说是这样,我是说这样做是一种很好的做法,它可以保护你在未来免于很多麻烦。 【参考方案1】:

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

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 数组编写为视频吗?【参考方案2】:

您好,我是 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)

我认为有更清洁的方法可以做到这一点,但我没有找到任何方法。

【讨论】:

只是一个旁注(这样以后我就不会再浪费时间了)opencv期望(宽度,高度)但numpy数组需要是(高度,宽度)。这就是为什么视频作者为 640,480 而 np 为 480,640。如果尺寸不匹配,videowriter 将静默失败。【参考方案3】:

您使用的是哪个操作系统?您确定您的系统安装了 PIM1 编解码器吗?

我使用的是 windows,我可以使用 cv.FOURCC(*"DIB ") 来显示未压缩的视频,或者使用 -1 来显示编解码器对话框。

安装 ffdshow 后,我可以使用cv.FOURCC(*"ffds") 对视频进行 MPEG-4 编码。

【讨论】:

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

以上是关于使用 cv2 VideoWriter 编写 numpy 数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 cv2.VideoWriter 中使用 FPS 参数?

cv2.VideoWriter() 在带有 Raspicam 的 Raspberry Pi 上不起作用

cv2.VideoWriter:请求一个元组作为 Size 参数,然后拒绝它

cv2.VideoWriter 保存图像为视频的几个问题

cv2.VideoWriter 不会使用fourcc h.264写入文件(使用罗技c920,python 2.7,windows 8)

OpenCV中的mp4视频编解码器