5
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()

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

Leb
  • 15,483
  • 10
  • 56
  • 75
Lin Che Chun
  • 51
  • 1
  • 1
  • 2
  • 1
    Possible duplicate of http://stackoverflow.com/questions/21871540/opencv-error-assertion-failed-scn-3-scn-4 – optimist Jun 23 '15 at 05:50

4 Answers4

4

This typically happens to me when the filename doesn't exist or isn't an image.

vyruz
  • 83
  • 1
  • 8
  • Yup. For me (running same code) I found `frame == None`. So that tells me that cap.read() is not returning a frame. – Dan H Dec 16 '15 at 03:53
1

This is happening because there is an error in reading image from the video. you can try the below code and if you are seeing nothing, then the problem is with your webcam.

import cv2

cap = cv2.VideoCapture(0)
ret, frame = cap.read()

while ret:

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

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


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

If you are using a docker container to run your code, the issue might be in the way you set up your docker container. In particular, you need to specify a flag --device to enable a camera usage in the docker container when creating the container like this:

docker run --device <device-path> <rest-of-the-paramaters>

Before that, you need to check the path of the camera device by using ls -ltrh /dev/video* for Ubuntu. Usually, the path is /dev/video0.

Sayyor Y
  • 1,130
  • 2
  • 14
  • 27
0

I ran your code, it works perfectly fine for me. But I did get some indentation errors.

Here's the updated code:

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()

If one still gets this error, try doing the following:

  • check if your webcam works fine with any other library other than OpenCV
  • change VideoCapture(0) => VideoCapture(1)
  • Uninstall OpenCV and reinstall it
  • Relaunch your code editor or whatever
  • Switch to a different IDE (for example from PyCharm to Jupyter notebook)
  • Also add these in the above code :
    if ret:
         assert not isinstance(frame,type(None)), 'frame not found'

OR

assert (frame is not None) == ret, (ret, type(frame))

OR

    if not ret:
         print("Can't receive frame (stream end?). Exiting ...")
         break
Singh
  • 504
  • 4
  • 15