Запись массивов numpy с использованием cv2 VideoWriter

У меня проблема с записью игрового примера видео с использованием 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)

Я пробовал все возможные комбинации, получая файл размером 0 байт, если расширение было mpg, и 5,5 КБ, если это было avi. Я должен сказать, что некоторые указали, что я должен собрать библиотеку ffmpeg из исходного кода, а не получить ее. Ну, я сделал это на новой машине с помощью этого сайта http://vinayhacks.blogspot.com/2011/11/installing-opencv-231-with-ffmpeg-on-64.html. который также представил ошибку при компиляции opencv (ошибка была связана с ffmpeg). Теперь у меня действительно нет идей, как создать видео с помощью OPENCV?

заранее спасибо


person JustInTime    schedule 14.02.2012    source источник
comment
Если по какой-то причине cv2.VideoWriter()' не удалось.... writer будет равно нулю. Как насчет того, чтобы проверить это перед выполнением цикла?   -  person karlphillip    schedule 14.02.2012
comment
когда я пишу Writer.isOpened, он возвращает мне True, поэтому я не думаю, что это None   -  person JustInTime    schedule 15.02.2012
comment
Я не говорю, что это так, я говорю, что это хорошая практика, и это защитит вас от многих головных болей в будущем.   -  person karlphillip    schedule 15.02.2012


Ответы (3)


VideoWriter имеет последний аргумент isColor со значением по умолчанию True. Поэтому, если вы измените его на False, вы сможете писать свои 2D-массивы.

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)
person Community    schedule 08.07.2015
comment
Любая идея, как написать массив 3d numpy как видео? - person Ernest S Kirubakaran; 10.02.2021

Здравствуйте, я новичок в opencv, и у меня была такая же проблема. Похоже, что write.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)

Я предполагаю, что есть более чистые способы сделать это, но я их не нашел.

person creyesk    schedule 14.09.2013
comment
просто примечание (чтобы в будущем я больше не тратил время впустую), что opencv ожидает (ширину, высоту), но массив numpy должен быть (высота, ширина). вот почему 640 480 за видеорайтер и 480 640 за нп. видеорайтер молча выйдет из строя, если размеры не совпадают. - person otterb; 02.10.2015

Какую ОС вы используете? Вы уверены, что в вашей системе установлен кодек PIM1?

Я использую Windows и могу использовать cv.FOURCC(*"DIB ") для несжатого видео или использовать -1 для отображения диалогового окна кодека.

После установки ffdshow я могу использовать cv.FOURCC(*"ffds") для кодирования видео в MPEG-4.

person HYRY    schedule 15.02.2012
comment
Я использую Ubuntu 10.04, уже пробовал его с -1, но он представляет для меня эту ошибку сообщения об ошибке: (-210) Бэкенд Gstreamer Opencv не поддерживает этот кодек на самом деле. в функции CvVideoWriter_GStreamer::open - person JustInTime; 15.02.2012