没找到opencv如何一次性获取所有相机的办法,因此用了一种很流氓的办法:打开所有相机
因为opencv的相机列表是用number来访问的,所以只要从0开始遍历打开相机,只要打不开相机就停止
这个代码是应用在pyqt上的,点击获取按钮,然后会将数组添加到combobox列表中,就可以查看并选择相机了
from PyQt5 import QtCore, QtWidgets, QtGui, QtMultimedia
import cv2
from PyQt5.QtMultimedia import QMediaContent
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class MainUi(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainUi, self).__init__(parent)
pass
def getCameraList(self):
"""
获取相机列表
"""
num = 10
try:
index_list = []
for i in range(0, num):
cap = cv2.VideoCapture(i)
if cap.isOpened():
index_list.append(i)
cap.release()
else:
break
except:
msg_box = QtWidgets.QMessageBox
msg_box.critical(self, 'error', '读取摄像机列表失败', msg_box.Ok)
return -1
if len(index_list) <= 0:
msg_box = QtWidgets.QMessageBox
msg_box.critical(self, 'error', '读取摄像机列表失败', msg_box.Ok)
return -1
return len(index_list)
def button_check_camera_click(self):
"""
点击按钮检查相机
"""
self.camera_clear()
index = self.getCameraList()
if index == -1:
return
self.button_open_camera.setEnabled(True) # 打开相机按钮转为可触状态
self.combobox_select_camera.addItems(list(map(lambda x: str(x) + '号摄像头', range(0, index)))) # 添加相机编号到Combobox中
def button_open_camera_click(self):
"""
打开选中的相机
"""
if self.button_open_camera.text() == '关闭相机':
self.button_open_camera.setText('打开相机')
cv2.destroyAllWindows()
if self.cap.isOpened():
self.cap.release()
else:
try:
CAM_NUM = int(self.combobox_select_camera.currentIndex())
flag = self.cap.open(CAM_NUM)
if not flag:
msg = QtWidgets.QMessageBox.warning(self, "Warning", "请检测相机与电脑是否连接正确",
buttons=QtWidgets.QMessageBox.Ok,
defaultButton=QtWidgets.QMessageBox.Ok)
return
self.button_open_camera.setText('关闭相机')
self.show_camera()
except:
return