【Python】Opencv调用摄像头问题

使用Opencv调用摄像头时遇到的一些问题。

  1. 摄像头索引位置问题
  2. 图像显示出错、卡崩(未响应)问题
  3. 调用成功,但没图像或固定图像

摄像头索引位置

使用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魔法摄像头的保护功能
    找到并解除就行了
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容