21

我通过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)但它显示找不到相机

我该如何解决这个问题?

4

13 回答 13

15

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

cap = cv2.VideoCapture(-1)

这解决了这个问题。

于 2020-07-26T19:22:15.320 回答
11

当我创建多个 cv2.VideoCapture(0) 实例时,我遇到了同样的问题。因此,请检查您的代码是否包含多个初始化或多次调用 cv2.VideoCapture(0) 的部分。我在调试模式下运行烧瓶服务器时遇到了这个问题,因为它调用了 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
于 2020-05-15T10:58:27.500 回答
5

很可能是权限问题/dev/video0

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

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

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

注销并重新登录并尝试。

于 2020-10-22T20:48:33.407 回答
4

我遇到了同样的问题并尝试了几种方法,例如cv2.VideoCapture(-1)cv2.VideoCapture(1)但没有太大成功。

阅读本文禁用调试模式后我成功了

于 2021-02-18T15:14:15.187 回答
2

我不会去那部分你想要做什么,这里只是一段代码,可以在你每次运行时打开你的相机,

蟒蛇: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()
于 2019-12-17T09:43:19.470 回答
1

我在 Ubuntu 上也遇到过这个问题

我已经通过这些命令解决了这个问题

sudo adduser 用户名视频 sudo usermod -a -G 视频用户名

用户名 - 这是您设备的名称

比写

身份证 -a

并从 () 复制索引

对我来说是1000

所以不仅仅是写:

相机 = cv2.VideoCapture(1000)

于 2021-12-08T21:09:02.760 回答
1

OP 似乎在 Raspberry PI 上运行。Raspberry 正在迁移到一个新系统来管理摄像头,因此当用户通过sudo apt-get upgrade摄像头系统升级操作系统时,会获取新库并禁用旧摄像头系统。要再次启用旧相机系统,请尝试

sudo raspi-config

然后选择

3 Interface Options    Configure connections to peripherals

然后选择

I1 Legacy Camera Enable/disable legacy camera support

并按照说明启用,然后重新启动。

当然,这个补丁只能工作这么久,因为旧系统已被弃用。

于 2021-12-09T14:39:52.183 回答
1

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

于 2020-03-23T11:41:19.093 回答
1

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

于 2021-02-16T01:06:06.397 回答
0

对于 Linux,确保 OpenCV 是使用 WITH_V4L 构建的(带有 linux 视频)。

于 2021-09-20T17:07:05.690 回答
0

我在https://github.com/opencv/opencv/issues/19527中找到了一个解决方案,其中视频捕获位于函数内部而不是外部。这对我有用(ubuntu)

def frame_generation():

camera = cv2.VideoCapture(0) #resolved, correct position

while(True):
于 2022-02-08T09:59:36.240 回答
0

我也有同样的问题。只需将其更改为 1,它就可以正常工作。我想这与您使用的相机设备的数量有关。

例如,我想我有 Iruin 外接摄像头作为我这次没有连接的第一个选项。

这是错误和更正的代码。

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

要更改的代码:

vid = cv2.VideoCapture(1)
于 2021-09-01T18:50:11.523 回答
-1

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

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

于 2021-01-03T11:43:10.257 回答