Travis Williams
Travis Williams

Reputation: 171

cv2.VideoWriter: Asks for a tuple as Size argument, then rejects it

I'm using OpenCV 4.0 and Python 3.7 to create a timelapse video.

When constructing a VideoWriter object, the documentation says the Size argument should be a tuple.

When I give it a tuple it rejects it. When I try to replace it with something else, it won't accept it because it says the argument isn't a tuple.

When Size not a tuple:

out = cv2.VideoWriter('project.avi', 1482049860, 30, height, width)
SystemError: new style getargs format but argument is not a tuple

When I changed Size to a tuple:

out = cv2.VideoWriter('project.avi', 1482049860, 30, (height, width))
TypeError: must be real number, not tuple

I just want to create a simple cv2.VideoWriter object.

Upvotes: 10

Views: 2962

Answers (3)

xelmirage
xelmirage

Reputation: 61

I encountered the same situation, here is my solution:

It seems like cv2.VideoWriter() tend to "drop" the argument that has the wrong type. In my case I used pathlib.Path for the first output file name argument,like:

p=Path('project.avi')

out = cv2.VideoWriter(p, 1482049860, 30, frameSize=(height, width))

But cv2.VideoWriter() only accepts str, so it "dropped" the p, and it received:

out = cv2.VideoWriter(1482049860, 30, frameSize=(height, width))

Then (height, width) is actually at the fps position, it requires real but gets tuple

So I suggest you check every argument to make sure they have the right type.

Upvotes: 4

Travis Williams
Travis Williams

Reputation: 171

I was trying to take the height and width from an uploaded video using:

width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)

I changed it to:

width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

Now I don't get that error. It doesn't work yet as a whole, but that particular error isn't there anymore.

Upvotes: 7

ohyesyoucan
ohyesyoucan

Reputation: 178

Try updating to opencv v4.1.0. Not seeing that issue there.

Else try:

out = cv2.VideoWriter('project.avi', 1482049860, 30, frameSize=(height, width))

Upvotes: 1

Related Questions