2012-02-14 2 views
4

У меня есть проблема с написанием игрушечного примером видео с помощью opencv2.3.1 VideoWriter, вот как я это делаю:Написание Numpy массивов с использованием CV2 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.5kb, если оно было avi. Я должен сказать, что некоторые указали, что я должен построить библиотеку ffmpeg из источника, а не apt-получить ее. Хорошо, я сделал это на новой машине, основанной на помощи этого сайта http://vinayhacks.blogspot.com/2011/11/installing-opencv-231-with-ffmpeg-on-64.html. который также представил ошибку при компиляции opencv (ошибка была связана с ffmpeg). Теперь я действительно из идей, Как сгенерировать видео с помощью OPENCV?

Заранее благодарен

+0

Если по какой-либо причине 'cv2.VideoWriter() '' failed ... 'writer' будет nil. Как насчет тестирования перед выполнением цикла? – karlphillip

+0

, когда я пишу writer.isOpened, он возвращается для меня. Правда, поэтому я не думаю, что это None. – JustInTime

+0

Я не говорю, что это так, я говорю, что это хорошая практика, и это защитит вас от многих головные боли в будущем. – karlphillip

ответ

1

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

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

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

+0

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

1

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

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

+1

просто боковое примечание (так что будущее меня не будет тратить время снова), что opencv ожидает (ширина, высота), но numpy array должен быть (высота, ширина). вот почему 640 480 для видеосъемки, но 480 640 для np. видеоаутер будет молча работать, если размеры не совпадают. – otterb

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)