使用Opencv调用摄像头时遇到的一些问题。
- 摄像头索引位置问题
- 图像显示出错、卡崩(未响应)问题
- 调用成功,但没图像或固定图像
摄像头索引位置
使用cv2.VideoCapture(idx)
调用摄像头时要知道摄像头设备的索引位置,来理清寻找思路。
首先去设备管理器查看硬件运行是否正常,或者使用其他调用摄像头的程序测试,如360魔法摄像头,微信、qq视频等。
然后,使用opencv调用摄像头。一般来说,内置摄像头为 idx = 0
,外部摄像头为idx = 1
;但是,我2015年买的联想笔记本,其内置摄像头索引为idx = 700
,外置摄像头为idx = 1400
。找了半天,真是莫名其妙。
可以用循环查找摄像头位置:
import cv2
i = 0
while True:
cap = cv2.VideoCaptrue(i)
if cap.isOpened(): # 当摄像头为开启状态时打印索引位置
print(i)
if cv2.waitKey(5)==ord('q'): # 按 q 退出
break
i = i+1
cap.release()
图像显示时出错或崩溃(未响应)
一般有两种情况:
- 读取摄像头图像太快,频率太高,引起卡崩
- 虽然摄像头在运行,但是没有图像信息导致出错(
cv2.imshow('winName', img)
不会自动检测img
是不是可用的)
解决方法:
- 降低摄影头读取频率,使用
cv2.waitKey()
函数等待 - 利用条件和循环只显示有效的图像,
cap.read()
返回的第一个参数是bool型,表示是否读取到图像
比如:
import cv2
cap = cv2.VideoCaptrue(700) # 我的摄像头位置是700
cv2.waitKey(5) # 等待5ms
while cap.isOpened(): # 也可以是 while True
ok, img = cap.read()
if ok: # 若读取到图像再进行显示
cv2.imshow('winName', img)
if cv2.waitKey(5)==ord('q'): # 等到5ms检测是否退出,同时防止读取太快
cv2.destroyWindow('winName')
break
cap.release()
调用成功,但没图像或固定图像
貌似是因为其他软件为了个人隐私安全锁定了摄像头图像,
- 可能是系统、电脑自带的保护
- 可能是第三方软件,如360魔法摄像头的保护功能
找到并解除就行了