多个摄像头馈送不适用于 PyQt5 线程:

Posted

技术标签:

【中文标题】多个摄像头馈送不适用于 PyQt5 线程:【英文标题】:Multiple camera feeds not working with PyQt5 threading: 【发布时间】:2019-04-22 08:41:22 【问题描述】:

我有一个数据收集软件,它需要来自两个不同摄像头源的摄像头馈送,一个是 Brio 网络摄像头,另一个是通过 USB 网络共享连接的 IP 网络摄像头。 现在,当我编辑用于流式传输两个多个视频的代码时,它只显示一个而不是另一个。 代码如下:

import sys
import cv2
#from gsp import GstreamerPlayer
import datetime
from pyfirmata import util, Arduino
from PyQt5 import QtCore, QtGui
import openpyxl
from openpyxl import load_workbook
from PyQt5.QtCore import pyqtSlot, QThread, pyqtSignal
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import QLayout, QDialog, QApplication, QMainWindow, QFileDialog, QPushButton, QWidget, QLabel
from PyQt5.uic import loadUi
import xlrd
from xlutils.copy import copy
import serial
import xlsxwriter
from xlwt import Workbook
sys.setrecursionlimit(15000)

# For the camera feed
class Thread(QThread):
    changePixmap = pyqtSignal(QImage)
    def run(self):
        cap = cv2.VideoCapture(0)
        while True:
            ret, frame = cap.read()
            if ret:
                rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                convertToQtFormat = QImage(rgbImage.data, rgbImage.shape[1], rgbImage.shape[0], QImage.Format_RGB888)
                p = convertToQtFormat.scaled(256, 181)
                self.changePixmap.emit(p)


class Thread1(QThread):
    changePixmap = pyqtSignal(QImage)

    def run(self):
        cap = cv2.VideoCapture('http://192.168.42.129:8080/video')
        while True:
            ret, frame = cap.read()
            if ret:
                rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                convertToQtFormat = QImage(
                    rgbImage.data, rgbImage.shape[1], rgbImage.shape[0], QImage.Format_RGB888)
                p1 = convertToQtFormat.scaled(111, 181)
                self.changePixmap.emit(p1)

main中的调用函数如下:

 @pyqtSlot(QImage)
 def setImage(self, image):
     self.webcam.setPixmap(QPixmap.fromImage(image))

 @pyqtSlot(QImage)
 def setImage1(self, image):
     self.webcam_2.setPixmap(QPixmap.fromImage(image))

 def initUI(self):
    th = Thread(self)
    th1 = Thread1(self)
    th1.changePixmap1.connect(self.setImage1)
    th.changePixmap.connect(self.setImage)
    th.start()

我是 python 编程的新手,谁能告诉我我在这里做错了什么?我尝试了另一种在函数中进行流式传输并设置流的方法,但这不是传统方法,因为我的应用程序由于 while 循环而不断崩溃*(我猜)*。 如果我一次使用一个来源,它可以工作,但我似乎无法一次让它们工作。

【问题讨论】:

错字:添加th1.start() 是的,我明白了。谢谢 【参考方案1】:

因为我没有添加,所以我解决了它

thread.start()

之前的功能。

【讨论】:

以上是关于多个摄像头馈送不适用于 PyQt5 线程:的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5学习笔记--摄像头实时视频展示多线程处理视频编解码

在 iPhone 上处理 GPU(金属)和 CPU(OpenCV)上的摄像头馈送数据

MLkit 人脸检测不适用于 android 的前置摄像头

cv::VideoCapture 适用于网络摄像头,但不适用于 IP 摄像头?

网络摄像头在 Ubuntu 12.04 中不起作用,适用于奶酪,不适用于 OpenCV

英特尔实感 SDK 不适用于其他实感摄像头