pycharm中
python3.10
opencv4.5.5
其他均可正常运行,调取摄像头可以正常运行代码(已经验证的正确代码)一段时间,然后就闪退报错,也不知道是不是笔记本摄像头坏了。如图
这是报错的代码行
只运行调用显示摄像头也会报错
不确定因素,不知道联想拯救者的设置是否会影响摄像头权限
我按照版本不匹配的方法在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
应该不是摄像头问题,是你的代码问题
这是你路径写错了,调用不到,下文应该有帮助