Генерация видео из numpy массивов с помощью openCV - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь использовать класс openCV VideoWriter для создания видео из массивов numpy. Я использую следующий код:

import numpy as np
import cv2
size = 720*16//9, 720
duration = 2
fps = 25
out = cv2.VideoWriter('output.avi', cv2.VideoWriter_fourcc(*'X264'), fps, size)
for _ in range(fps * duration):
    data = np.random.randint(0, 256, size, dtype='uint8')
    out.write(data)
out.release()

Кажется, что установлен код c, так как ffmpeg может преобразовывать в код x264 c и установлен libx264. Код запускается без предупреждений, однако сгенерированные видеоролики, похоже, не содержат данных, так как я всегда получаю следующее сообщение при попытке прочитать их с помощью mpv:

[ffmpeg / demuxer] avi: Не удалось найти код c параметры для потока 0 (Видео: h264 (X264 / 0x34363258), нет, 1280x720): неуказанный формат пикселей

В чем может быть причина этой проблемы?

1 Ответ

0 голосов
/ 14 июля 2020

Первая проблема заключается в том, что вы пытаетесь создать видео с использованием черно-белых кадров, в то время как VideoWriter использует цвет по умолчанию. VideoWriter имеет 5-й логический параметр, в котором вы можете передать False, чтобы указать, что видео должно быть черно-белым.

Вторая проблема заключается в том, что размеры, которые ожидает cv2, противоположны numpy. Таким образом, размер должен быть (размер [1], размер [0]).

Возможной дополнительной проблемой является использование кода c. Мне никогда не удавалось заставить «X264» работать на моей машине, и вместо этого я использовал «mp4v» в качестве кода c и «.mp4» для типа контейнера, чтобы получить выходные данные в кодировке H.264 *. 1005 *

Вот результат после того, как все эти проблемы будут исправлены. Попробуйте это и посмотрите, работает ли это для вас:

import numpy as np
import cv2
size = 720*16//9, 720
duration = 2
fps = 25
out = cv2.VideoWriter('output.mp4', cv2.VideoWriter_fourcc(*'mp4v'), fps, (size[1], size[0]), False)
for _ in range(fps * duration):
    data = np.random.randint(0, 256, size, dtype='uint8')
    out.write(data)
out.release()
...