Search code examples
pythonopencvwebcamvideo-capture

How do I read a video from a webcam with OpenCV?


I'm following the official documentation, trying to read a video from a webcam. As I run the piece of code from the documentation:

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

it fails with the following output:

OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor, file /io/opencv/modules/imgproc/src/color.cpp, line 9748
Traceback (most recent call last):
File "capture.py", line 11, in
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.error: /io/opencv/modules/imgproc/src/color.cpp:9748: error: (-215) scn == 3 || scn == 4 in function cvtColor

Inspecting it further, it appears that:

  • ret is always False.
  • Adding cap.get(3) (to get the width of the picture) returns 0.0.
  • If I test cap.isOpened(), the result is always False.
  • If I add a call to cap.open(0), open returns False as well.
  • Calling cap.open("/dev/video0") changes nothing.
  • Replacing cap = cv2.VideoCapture(0) by cap = cv2.VideoCapture("/dev/video0") has no effect.

Opening /dev/video0 in VLC shows the video from the webcam. When I open Cheese, it also shows the video from the webcam. There is only one camera connected to the PC.

Any suggestions?


Solution

  • You're probably missing FFMPEG. OpenCV needs the codec information to decode the videos, open cameras, etc which ffmpeg provides.

    The steps to install FFmpeg on Windows are detailed here http://www.wikihow.com/Install-FFmpeg-on-Windows. Following the Linux equivalent of this might solve your problem