7

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

4 Answers 4

14

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.

2
  • 1
    I already tried it, I used size = (int(cap.get(3)), int(cap.get(4))), and then out = cv2.VideoWriter('cv2_camera_output.avi',fourcc, 20.0, size)but it still doesn't work. Thank you for your effort anyway!
    – MisterMM23
    Commented Aug 19, 2017 at 10:43
  • Although it's not a bad suggestion, this should not be the accepted answer if it is not the solution that worked.
    – rgov
    Commented Jul 31, 2019 at 20:45
10

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.

1
  • if (len(img.shape)==2): img = cv.cvtColor(img, cv.COLOR_GRAY2BGR) video_Writter.write(img)
    – Wade Wang
    Commented Aug 25, 2022 at 9:49
0

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.

0

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

Not the answer you're looking for? Browse other questions tagged or ask your own question.