MisterMM23
MisterMM23

Reputation: 220

python - Output by OpenCV VideoWriter empty

I have recently started to program with opencv-python, but I got stuck when I tried to write a video using cv2. The output by the script is empty. Here's my code:

import cv2
import numpy as np
import matplotlib.pyplot as plt

cap = cv2.VideoCapture(0)

fourcc = cv2.VideoWriter_fourcc(*'h263')
out = cv2.VideoWriter('cv2_camera_output.mp4',fourcc, 20.0, (800,600))


while True:
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('frame', frame)
    cv2.imshow('gray', gray)
    out.write(frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break


cap.release()
out.release()
cv2.destroyAllWindows()

I guessed that the issue must have something to do with the fourcc codec. So I googled if there was a fourCC codec for mac (I am using OS X 10.12.3 (Sierra)), but all the suggestions didn't work for my computer, so the issue may not even be in the fourCC codec. These are the links I have visited:

OpenCV Documentation (I didn't follow this one, it was just to make sure, and it didn't work either)

GitHub Tests for FourCC codecs on OS X

Does anybody know the real issue? Any help would be great

Upvotes: 7

Views: 10958

Answers (4)

Math_Max
Math_Max

Reputation: 187

My problem was actually that I did not have space left on my disk. It not did give a warning.

Upvotes: 0

MisterMM23
MisterMM23

Reputation: 220

I solved the problem. The problem simply was that I could not use the VideoWriter for grayscale, so I had to use it for the coloured frame.

Upvotes: 10

user2986898
user2986898

Reputation: 423

Biggest problem is that h263 specifies the exact frame sizes it can encode (take a look at the possible values at https://en.wikipedia.org/wiki/H.263#Version_1_and_Annex_I) and you don't comply with that.

After resolving this issue it is possible that h263 still won't work with mp4 container on OSX (on Linux and Windows it doesn't because they use FFMPEG as backends but OSX uses another library) so I suggest that you use avi as container.

And lastly you will have to either resize your image (just like @ROAR said) or use the dimensions of the input device like this:

width  = int(cap.get(3))
height = int(cap.get(4))

Although if you do the latter with h263 codec than you have to use an input device which produces frames that are compliant with the size restrictions.

Upvotes: 0

Arash Rohani
Arash Rohani

Reputation: 1014

Your frame width and height must be the same as the width and height of your VideoWriter. Just add this before out.write(frame) and you might be fine:

frame = cv2.resize(frame,(800,600))

Or change the size of your VideoWriter to the initial size of webcam frame. Mine is (640,480). I think if your OS doesn't support the format, it just won't write anything. Not even an empty file will be created. I'm on Linux and I think 'h263' doesn't work on it but 'h264' does. When I use 'h263' it just doesn't make any file.

Upvotes: 14

Related Questions