使用 cv2 VideoWriter 编写 numpy 数组

Jus*_*ime 9 python opencv ffmpeg numpy x264

我在使用 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)
Run Code Online (Sandbox Code Playgroud)

如果扩展名是 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 生成视频?

提前致谢

小智 8

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)
Run Code Online (Sandbox Code Playgroud)


cre*_*esk 5

你好,我是 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)
Run Code Online (Sandbox Code Playgroud)

我认为有更干净的方法可以做到这一点,但我还没有找到。

  • 只是一个旁注(这样将来我就不会再浪费时间了)opencv 期望(宽度,高度)但 numpy 数组需要是(高度,宽度)。这就是为什么 videowriter 为 640,480 而 np 为 480,640。如果尺寸不匹配,视频编写器将默默失败。 (11认同)

HYR*_*YRY 1

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

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

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