OpenCv错误无法通过视频捕获打开相机

时间:2019-12-17 09:22:49

标签: python-3.x opencv ubuntu video-capture

我通过opencv使用cam,重新启动后突然运行代码,显示以下错误:

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

我也尝试过使用cap = cv2.VideoCapture(1),但随后显示找不到相机

如何解决此问题?

8 个答案:

答案 0 :(得分:6)

当我创建多个cv2.VideoCapture(0)实例时,我遇到了同样的问题。因此,请检查您的代码是否包含多个初始化或多次调用cv2.VideoCapture(0)的部分。在调试模式下运行Flask服务器时,我遇到了这个问题,因为它两次调用了cv2.VideoCapture(0)。

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

错误:

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

答案 1 :(得分:4)

我遇到了同样的错误。尝试将0更改为-1

cap = cv2.VideoCapture(-1)

这解决了问题。

答案 2 :(得分:3)

我遇到了同样的问题,并尝试了 cv2.VideoCapture(-1)cv2.VideoCapture(1) 等多种方法,但没有取得多大成功。

我在阅读 this article禁用调试模式

后成功了

答案 3 :(得分:1)

我将不介绍该部分的内容,这只是一段代码,每次运行时都可以打开您的相机,

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

答案 4 :(得分:1)

就我而言,我只是将 cam 重新连接到 USB 端口,然后就解决了!我认为这个错误是由以错误的方式关闭窗口引起的。请在关闭窗口后立即检查终端是否有异常。

答案 5 :(得分:0)

我遇到了同样的问题, 只需将0更改为1,然后更改为-1,然后再次更改为0。 不知道为什么这对我有用。

答案 6 :(得分:0)

很可能是/dev/video0上的权限问题。

检查您是否属于“视频”组。
id -a

如果您在组列表中没有看到视频,请添加 sudo usermod -a -G video

对于Ubuntu用户:(20.04)
sudo usermod -a -G video $LOGNAME

注销并重新登录并尝试。

答案 7 :(得分:0)

这个问题是由于中断造成的。例如尝试使用键'q'结束执行,不要突然关闭窗口。

我通过再次打开终端并再次执行相同的脚本解决了同样的问题。