-1

我有这个应该制作视频的python代码:

import cv2
import numpy as np

out = cv2.VideoWriter("/tmp/test.mp4",
                      cv2.VideoWriter_fourcc(*'MP4V'),
                      25,
                      (500, 500),
                      True)
data = np.zeros((500,500,3))
for i in xrange(500):
    out.write(data)

out.release()

我期待一个黑色视频,但代码抛出一个断言错误:

$ python test.py
OpenCV(3.4.1) Error: Assertion failed (image->depth == 8) in writeFrame, file /io/opencv/modules/videoio/src/cap_ffmpeg.cpp, line 274
Traceback (most recent call last):
  File "test.py", line 11, in <module>
    out.write(data)
cv2.error: OpenCV(3.4.1) /io/opencv/modules/videoio/src/cap_ffmpeg.cpp:274: error: (-215) image->depth == 8 in function writeFrame

我尝试了各种fourcc 值,但似乎都没有。

4

2 回答 2

2

根据@jeru-luke 和@dan-masek 的评论:

import cv2
import numpy as np

out = cv2.VideoWriter("/tmp/test.mp4",
                      cv2.VideoWriter_fourcc(*'mp4v'),
                      25,
                      (1000, 500),
                      True)

data = np.transpose(np.zeros((1000, 500,3), np.uint8), (1,0,2))
for i in xrange(500):
    out.write(data)

out.release()
于 2018-08-24T16:24:37.270 回答
2

问题是您在调用时没有指定元素的数据类型np.zeros。正如文档所述,默认情况下 numpy 将使用float64.

>>> import numpy as np
>>> np.zeros((500,500,3)).dtype
dtype('float64')

但是,该VideoWriter实现仅支持 8 位图像深度(如错误消息中的“(image->depth == 8)”部分所示)。

解决方案很简单——在本例中指定适当的数据类型uint8

data = np.zeros((500,500,3), dtype=np.uint8)
于 2018-08-24T16:30:37.917 回答