Ошибка подтверждения при создании видео MP4 из пустых массивов с помощью OpenCV - PullRequest
0 голосов
/ 24 августа 2018

У меня есть этот код 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 ]

0 голосов
/ 24 августа 2018

Проблема в том, что вы не указали тип данных элементов при вызове 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)
0 голосов
/ 24 августа 2018

Согласно комментариям @ 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()
...