python+pyqt5+opencv实现在qt界面调用多个摄像头

今天实现一个在qt界面调用多个摄像头展示,摄像头包括自己本机的一个摄像头和三个外接摄像头,首先我想三个外接摄像头同时插到一个usb集线器上(拓展坞),通过分别给三个编号,自己电脑是0,三个外接是1,2,3,发现4个摄像头最多只能展示本机的和一个外接的,其余两个外接的一直展示不了,最后一直搜索,终于让我发现了问题。首先先给代码:

from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import cv2
class Ui_MainWindow(QtWidgets.QWidget):

 def __init__(self, parent=None):
    super().__init__(parent)

    self.timer_cameras = []  # 为每个摄像头定义一个定时器
    self.caps = []  # 存储每个摄像头的VideoCapture
    self.CAM_NUMS = [0, 1, 2, 3]  # 包括电脑上的摄像头和三个外接摄像头的编号

    self.set_ui()
    self.slot_init()

def set_ui(self):
    self.__layout_main = QtWidgets.QHBoxLayout()

    # 创建四个 QLabel 用于显示四个摄像头画面
    self.label_cameras = [QtWidgets.QLabel() for _ in range(4)]

    for label_camera in self.label_cameras:
        label_camera.setFixedSize(320, 240)
        label_camera.setStyleSheet('''QWidget{border-radius:7px;background-color:#d3d3d3;}''')

    self.__layout_fun_button = QtWidgets.QVBoxLayout()
    self.button_open_cameras = QtWidgets.QPushButton('打开摄像头')
    self.button_close = QtWidgets.QPushButton('退出')
    self.button_open_cameras.setMinimumHeight(50)
    self.button_close.setMinimumHeight(50)

    self.__layout_fun_button.addWidget(self.button_open_cameras)
    self.__layout_fun_button.addWidget(self.button_close)

    self.__layout_main.addLayout(self.__layout_fun_button)

    # 将四个 QLabel 加入到总布局中
    for label_camera in self.label_cameras:
        self.__layout_main.addWidget(label_camera)

    self.setLayout(self.__layout_main)

def slot_init(self):
    self.button_open_cameras.clicked.connect(self.button_open_cameras_clicked)
    self.button_close.clicked.connect(self.close)

    # 初始化定时器和摄像头
    for i, cam_num in enumerate(self.CAM_NUMS):
        timer_camera = QtCore.QTimer()
        self.timer_cameras.append(timer_camera)

        cap = cv2.VideoCapture()
        self.caps.append(cap)

        self.timer_cameras[i].timeout.connect(lambda i=i, cam_num=cam_num: self.show_camera(i, cam_num))

def button_open_cameras_clicked(self):
    for i, cam_num in enumerate(self.CAM_NUMS):
        if not self.timer_cameras[i].isActive():
            flag = self.caps[i].open(cam_num, cv2.CAP_DSHOW)
            if not flag:
                msg = QtWidgets.QMessageBox.warning(self, 'warning', f"请检查相机 {cam_num} 是否连接正确",
                                                    buttons=QtWidgets.QMessageBox.Ok)
            else:
                self.timer_cameras[i].start(30)
    self.button_open_cameras.setText('关闭摄像头') if any(timer.isActive() for timer in self.timer_cameras) else self.button_open_cameras.setText('打开摄像头')

def show_camera(self, index, cam_num):
    flag, image = self.caps[index].read()
    image = cv2.flip(image, 1)
    show = cv2.resize(image, (320, 240))
    show = cv2.cvtColor(show, cv2.COLOR_BGR2RGB)
    show_image = QtGui.QImage(show.data, show.shape[1], show.shape[0], QtGui.QImage.Format_RGB888)
    self.label_cameras[index].setPixmap(QtGui.QPixmap.fromImage(show_image))

if name == ‘main’:
app = QtWidgets.QApplication(sys.argv)
ui = Ui_MainWindow()
ui.show()
sys.exit(app.exec_())

解决方法来了:其实很傻,就是不要用集线器哈哈,将外接摄像头直接连接到你的电脑上试试,反正我直接成功了,再搜索一天放到集线器上的方法,解决了我就更新一下,希望有会的小伙伴可以评论一下,拜托了!如果有帮助到你,希望点个赞,留下你的评论!
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值