Reputation: 2776
I have a problem with writing a toy example video using opencv2.3.1 VideoWriter, here is how I do it:
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)
I tried every possible combination resulting with a 0 bytes file if the extension was mpg, and 5.5kb if it was avi. I should say that some pointed out that I should build the ffmpeg library from source and not apt-get it. Well I did that on a fresh machine based on the help of this site http://vinayhacks.blogspot.com/2011/11/installing-opencv-231-with-ffmpeg-on-64.html. which also presented an error while compiling opencv(the error was related to ffmpeg). Now I am really out of ideas, How to generate a video using OPENCV?
Thanks in advance
Upvotes: 12
Views: 20349
Reputation:
VideoWriter has last argument isColor
with default value True
.
So if you change it to False
then you can write your 2D arrays.
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)
Upvotes: 11
Reputation: 411
Hello I am new to opencv and I had this same problem. It appears that the writer.write(x) Needs x to be an array whit RGB values and not scalars. I solved the issue by doing this:
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)
I assume there are cleaner ways to do it but I haven't found any.
Upvotes: 5
Reputation: 97331
Which OS are you using? Are you sure your system have PIM1 codec installed?
I use windows, and I can use cv.FOURCC(*"DIB ")
for uncompressed video, or use -1 to show a codec dialog.
After install ffdshow, I can use cv.FOURCC(*"ffds")
to encode the video by MPEG-4.
Upvotes: 1