opencv掉用摄像头,只能亮一会就闪退并且报错

pycharm中
python3.10
opencv4.5.5
其他均可正常运行,调取摄像头可以正常运行代码(已经验证的正确代码)一段时间,然后就闪退报错,也不知道是不是笔记本摄像头坏了。如图

img

这是报错的代码行

img

只运行调用显示摄像头也会报错

img

不确定因素,不知道联想拯救者的设置是否会影响摄像头权限

img

我按照版本不匹配的方法在videocapture里面加上
cv2.CAP_DSHOW也只能运行一小段时候,确实不闪退,但是摄像头画面会静止,并且画面不停变换颜色

有安装vsfilter吗

我看报错信息都是获取不到图像类似的错误,如果确定别的电脑可以正常运行的情况下我想到的有两种可能:一种是你自己的笔记本电脑对摄像头权限有特别的设置,还有一种可能是你电脑里某个软件在占用摄像头。

需要判断读取图像函数的返回值

换电脑吧,你的电脑不行

如果加了CAP_DSHOW参数不退出了, 摄像头不一定有问题。建议
1) 先用windows 相机程序查看一下画面。WIN+Q -> camera , 如果windows 自带相机工作正常,可以排除硬件或驱动问题。继续下一步。
2) 我看到代码里,没有提前定义OpenCV的显示窗口,而且后面没有waitkey()方法,屏幕花颜色乱,是否是由于不断地重建窗口造成。
可能的原因:imshow 的窗口是临时创建的,后面没有waitkey()方法来保持窗口,没有后续帧,那么这个窗口可能会被系统自动关掉。

可以按下面代码试试看:

cap = cv2.VideoCapture(0)  # 获取摄像头
cv2.namedWindow(window_name)  # 创建一个窗口
while cap.isOpened():
    ok, frame = cap.read()  # ok表示摄像头读取状态,frame表示摄像头读取的图像
    if not ok:
        break
    cv2.imshow(window_name, frame)  # 将图像矩阵显示在一个窗口中
    if cv.waitKey(10) & 0xFF == ord('q'): 
         break

waitKey(10)的间隔,可以用10ms,除了保持窗口中,还可以避免驱动传过多的帧造成缓冲区溢出或者卡顿。
有的电脑上运行没问题,可能与驱动多长时间传帧有关系,没有waitkey保持新窗口,时间长一点,可能就自动关闭了。提前建窗口、waitkey() 这两种方式也可以分开测试一下,确定具体原因。

判断下需要获取到帧再调用cv2.imshow
最好先预热摄像头2s


import cv2
import time

video_name = 0 # 调用摄像头
# video_name = 'video/test.H264' # 调用文件
cap = cv2.VideoCapture(video_name)
time.sleep(2) # 预热摄像头2s
while (True):
    ret, frame = cap.read()
    # 检测是否到了视频尾部
    if not ret or frame is None:
        print('video is all read')
        break
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow("gray", gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

应该不是摄像头问题,是你的代码问题

这是你路径写错了,调用不到,下文应该有帮助


备选方案:
cv2.error error:... (-215:Assertion failed)_白日梦第一大玩家的博客-CSDN博客_-215:assertion failed 关于cv2.error error: …(-215:Assertion failed)解决方法今天在复现一个实例时,一直出现了cv2.error error:… (-215:Assertion failed),我开始怀疑是环境问题,然而和环境没有关系,这个是因为你在读取图像的路径的时候,路径写错了,修改就好了#这是我读取图像路径的格式img=cv.imread('./pictures/xingye-1.png')... https://blog.csdn.net/weixin_44688675/article/details/107853450