Ошибка подтверждения при создании видео MP4 из пустых массивов с помощью OpenCV
У меня есть этот код 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, но ни одна из них не работает.
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()
Проблема в том, что вы не указали тип данных элементов при вызове np.zeros
, Как указано в документации, по умолчанию numpy будет использовать float64
,
>>> import numpy as np
>>> np.zeros((500,500,3)).dtype
dtype('float64')
Тем не менее VideoWriter
Реализация поддерживает только 8-битную глубину изображения (как предполагает часть сообщения об ошибке "(image->deep == 8)").
Решение простое - укажите соответствующий тип данных, в этом случае uint8
,
data = np.zeros((500,500,3), dtype=np.uint8)