Reputation: 1250
I was using my cam through opencv and suddenly after restarting I ran my code it shows below error:
[ WARN:0] global /io/opencv/modules/videoio/src/cap_v4l.cpp (802) open VIDEOIO ERROR: V4L: can't open camera by index 0
Traceback (most recent call last):
File "test.py", line 20, in <module>
retval, buffer_img = cv2.imencode('.jpg', frame)
cv2.error: OpenCV(4.1.2) /io/opencv/modules/imgcodecs/src/loadsave.cpp:877: error: (-215:Assertion failed) !image.empty() in function 'imencode'
cap = cv2.VideoCapture(0) # here it throws an error
import json
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
retval, buffer_img = cv2.imencode('.jpg', frame)
resdata = base64.b64encode(buffer_img)
resdata = "data:image/png;base64,"+ str(resdata.decode("utf-8"))
PARAMS = {'image': resdata}
# Our operations on the frame come here
#gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Display the resulting frame
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
I also tried with cap = cv2.VideoCapture(1)
but then it shows can't find camera
How can I fix this issue?
Upvotes: 43
Views: 177085
Reputation: 40
I had a problem like you, in my case i closed the cammera with cap.release()
immediately after capturing frames
Upvotes: 0
Reputation: 1
This solution is for Mac only.
I used PyCharm rather than Anaconda. I couldn't figure out how to get Mac system to recognize the camera on Anaconda, but PyCharm, after running the code will ask for permission. Also, the opencv version for Anaconda is out of date and doesn't have some of the features of PyCharm.
Under System Settings, Privacy and Security, Camera make sure the camera is enabled for PyCharm.
The HD FaceTime camera is cap=cv2.VideoCapture(2)
not (0)
. You will find that cv2.VideoCapture(0).isOpened()
is True
, but the ret
, image=cap.read()
will return ret
as False
if it is the wrong camera.
if it is still not working, try adding this:
cap = cv2.VideoCapture(2)
cap.release()
cap= cv2.VideoCapture(2)
It could be that you have an open window that the program believes is opened.
Upvotes: 0
Reputation: 132
cap = cv2.VideoCapture(0)
The 0, 1, 2, etc digit we pass through the VideoCapture function is the device index given to the device from the os. As the device index is assigned by os, The number would be at random. So to find out the device index of your camera, in linux open command line
sudo apt-get install v4l-utils
Once installed use
v4l2-ctl --list-devices
to list all connected device something like this
Integrated Camera (usb-0000:00:3b.0-1.2):
/dev/video0
Upvotes: 2
Reputation: 1
The solution that worked for me as other contributors noted was to simply unplug the camera from the USB port and plug it back in, while the Raspberry PI Ubuntu OS was running.
Upvotes: 0
Reputation: 1
Don't know if this is still an issue. In my case, I was getting the same error until I unplugged and plugged the usb camera. Even if I reboot, the error happened.
It's similar to someone said: my camera was already been captured. The problem is that it was not used by my script, so it was hard to identify.
A few days before the issue, I installed the motion library, but just to test something and I didn't use it anymore. The motion starts at boot, so the camera was being captured by the service. That's why only the unplug-plug worked.
I uninstalled the library, and the error was gone.
Upvotes: 0
Reputation: 79
I have do everytime after restart or unplug usb camera and replug
chmod 777 /dev/video0
Upvotes: 0
Reputation: 11
Tried every anwser but only changing camera id from -1 to 1 and then back to 0 worked.
Upvotes: 1
Reputation: 43
I found a solution in https://github.com/opencv/opencv/issues/19527 where the video capture is inside the function instead of outside. That worked for me (ubuntu)
def frame_generation():
camera = cv2.VideoCapture(0) #resolved, correct position
while(True):
Upvotes: 4
Reputation: 193
The OP appears to be operating on a Raspberry PI. Raspberry is moving to a new system to manage cameras, so when the user upgrades the OS via sudo apt-get upgrade
the camera system gets the new library and the legacy camera system is disabled. To enable the legacy camera system again, try
sudo raspi-config
Then select
3 Interface Options Configure connections to peripherals
then select
I1 Legacy Camera Enable/disable legacy camera support
and follow the directions to enable and then reboot.
Of course, this patch will only work for so long, as the legacy system has been deprecated.
Upvotes: 2
Reputation: 19
I've also had this problem on Ubuntu
I've solved this by these comands
sudo adduser username video sudo usermod -a -G video username
username - it is the name of your device
than write
id -a
and copy index from ()
for me it is 1000
so than just write:
camera = cv2.VideoCapture(1000)
Upvotes: 1
Reputation: 112
For Linux, make sure OpenCV is built using the WITH_V4L (with video for linux).
Upvotes: 1
Reputation: 21
I also had the same problem. Just changed it to 1 and it was perfectly working. I guess it's related to the number of camera devices you have used.
For example, I guess I have Iruin external camera as my first option which I didn't connect this time.
Here is the error and corrected code.
global /tmp/pip-req-build-f51eratu/opencv/modules/videoio/src/cap_v4l.cpp (890) open VIDEOIO(V4L2:/dev/video0): can't open camera by index
Code to change:
vid = cv2.VideoCapture(1)
Upvotes: 2
Reputation: 416
I've encountered the same issue and attempted several methods like cv2.VideoCapture(-1)
or cv2.VideoCapture(1)
but without much success.
I succeeded after reading this article and disabling debug-mode
Upvotes: 2
Reputation: 19
In my case, I just reconnected cam to the usb port, and then it was solved! I think this error is caused by closing the window in the wrong way. Please check if there is any exception on the terminal right after closing the window.
Upvotes: 1
Reputation: 120
This issue is due to the interruption. Try to end the execution with the key 'q' for example, don't close the window suddenly.
I solved the same issue by opening terminal again and execute the same script again.
Upvotes: -1
Reputation: 191
Most likely a permission issue on /dev/video0
.
Check if you are part of "video" group.
id -a
if you don't see video in your group list add
sudo usermod -a -G video
for Ubuntu users:(20.04)
sudo usermod -a -G video $LOGNAME
Logout and log back in and try it.
Upvotes: 19
Reputation: 267
I got the same error. Try changing 0 to -1
cap = cv2.VideoCapture(-1)
This solved the issue.
Upvotes: 25
Reputation: 394
I got the same problem when I created more than one instance of the cv2.VideoCapture(0). So check if your code contains multiple initializations or sections which call cv2.VideoCapture(0) more than once. I was facing this problem while running the flask server in debug mode because it called cv2.VideoCapture(0) twice.
import cv2
cap = cv2.VideoCapture(0)
cap2 = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
Error:
python3 debugCamera.py
[ WARN:0] global /io/opencv/modules/videoio/src/cap_v4l.cpp (887) open VIDEOIO(V4L2:/dev/video0): can't open camera by index
Upvotes: 21
Reputation: 61
I had the same problem, Just change 0 to 1,then to -1 and back again to 0. Don't know why this worked for me.
Upvotes: 6
Reputation: 321
I will not go to that part What you are trying to do, here is just a block of code that can open your camera every time you run it,
python: 3.7.3
OpenCV: 4.1.0
import cv2
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
Upvotes: 2