当前位置:   article > 正文

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

python cv2打开多个摄像头

今天实现一个在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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

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

解决方法来了:其实很傻,就是不要用集线器哈哈,将外接摄像头直接连接到你的电脑上试试,反正我直接成功了,再搜索一天放到集线器上的方法,解决了我就更新一下,希望有会的小伙伴可以评论一下,拜托了!如果有帮助到你,希望点个赞,留下你的评论!
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/114949?site
推荐阅读
相关标签
  

闽ICP备14008679号