PyQt5利用QLabel全屏显示USB摄像头视频流

QLabel和画布QGraphicsView都可以实现全屏显示视频流,这次先说下QLabel,这个控件在全屏显示的时候会遇到一个问题,就是控件大小以及窗口模式的设置(参考:linux qt应用程序全屏,QT在ubuntu下实现界面全屏,侧边栏隐藏,上边栏隐藏【实例】..._落木君的博客-CSDN博客icon-default.png?t=M3C8https://blog.csdn.net/weixin_32816821/article/details/116685490

下面给出代码示例:

1.窗体部分(DisplayUI.py)

 

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import cv2
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QImage, QPixmap, QPainter
from PyQt5.QtWidgets import QApplication, QGraphicsScene, QGraphicsView, QGraphicsPixmapItem
from PyQt5.QtWidgets import QDesktopWidget
import numpy as np
from concurrent.futures import ThreadPoolExecutor

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        self.Main = MainWindow
        MainWindow.setObjectName("MainWindow")
        
        #获取整个屏幕的大小
        self.w = QApplication.desktop().width()
        self.h = QApplication.desktop().height()
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.DispalyLabel = QtWidgets.QLabel(self.centralwidget)
        self.DispalyLabel.setGeometry(QtCore.QRect(0, 0, 640, 480))
        self.DispalyLabel.setText("")
        self.DispalyLabel.setObjectName("label")
        self.DispalyLabel.setScaledContents(True)
        #设置为顶级窗口
        self.DispalyLabel.setWindowFlags(QtCore.Qt.Window|QtCore.Qt.FramelessWindowHint)
        self.DispalyLabel.showFullScreen()

        self.vbox = QtWidgets.QVBoxLayout(self.centralwidget)
        self.vbox.addWidget(self.DispalyLabel)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        #MainWindow.showFullScreen()

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))

2.视频流显示部分(videoDisplay.py)

 

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import os, sys
import cv2
import time
import json
import numpy as np
import threading
from PyQt5 import QtCore
from PyQt5.QtCore import QFile, QTimer
from PyQt5.QtWidgets import QFileDialog, QMessageBox
from PyQt5.QtWidgets import QApplication, QGraphicsScene, QGraphicsView
from PyQt5.QtGui import QImage, QPixmap
from concurrent.futures import ThreadPoolExecutor


grun = True
stop = False

class DisplayMain:
    def __init__(self, ui, mainWnd):
        self.ui = ui
        self.mainWnd = mainWnd
        self.isCamera = True

        self.isCamera = True
        self.cap = None
        self.frame_height = None
        self.frame_width = None

        self.fps = None
        self.size = None
        self.fourcc = None
     
        
              
        
        self.Open()
        # 创建一个关闭事件并设为未触发
        self.stopEvent = threading.Event()
        self.stopEvent.clear()
 
    def Open(self):
        
        self.cap = cv2.VideoCapture(0)

        self.frame_height = self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
        self.frame_width = self.cap.get(cv2.CAP_PROP_FRAME_WIDTH)
        self.fps = int(self.cap.get(cv2.CAP_PROP_FRAME_COUNT))
   
        #利用新的线程开启视频流
        th1 = ThreadPoolExecutor(1)
        th1.submit(self.Display)
        
        
    def Display(self):
        while self.cap.isOpened():
            success, frame = self.cap.read()
            # RGB转BGR
            frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
            #中间可以放一些操作视频的代码,比如放大、变换颜色或者放深度学习中提取目标的代码
            frame1 = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

            image = QImage(frame1, *(self.ui.w, self.ui.h), QImage.Format_RGB888).rgbSwapped()
            img_temp = image.copy()
            self.ui.DispalyLabel.setPixmap(QPixmap.fromImage(img_temp))

            # 判断关闭事件是否已触发
            if True == self.stopEvent.is_set():
            # 关闭事件置为未触发,清空显示label
                self.stopEvent.clear()
                self.ui.DispalyLabel.clear()
                self.ui.Close.setEnabled(False)
                self.ui.Open.setEnabled(True)
                self.cap.release()
                break

3.程序入口(main.py,运行这个函数启动程序

 

#!/usr/bin/python3
#-*- coding: utf-8 -*-
import sys
import DisplayUI
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QMessageBox
from VideoDisplay import DisplayMain

def mainUse():
    app = QApplication(sys.argv)
    mainWnd = QMainWindow()
    ui = DisplayUI.Ui_MainWindow()

    ui.setupUi(mainWnd)
    
    mainWnd.setWindowTitle('视频流显示')
    icon = QtGui.QIcon()
    #这句是图标
    #icon.addPixmap(QtGui.QPixmap('./pic/xxx.ico'), QtGui.QIcon.Normal, QtGui.QIcon.Off)
    mainWnd.setWindowIcon(icon)

    DisplayMain(ui, mainWnd)
    mainWnd.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    mainUse()

提示:全屏以后要退出可以按alt + F4关闭界面

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
为了利用PyQt5中的QLabel播放视频,你可以按照以下步骤进行操作: 1. 首先,确保你已经安装了PyQt5并成功配置到PyCharm中。你可以使用uic工具来编译.ui文件并生成对应的Python代码。 2. 创建一个新的PyQt5应用程序,并在其中导入所需的模块和类。你需要导入QLabel、QPixmap和QTimer来显示视频。 3. 创建一个带有QLabel的主窗口,并设置其大小和标题。 4. 使用QTimer来定时更新QLabel显示的视频帧。你可以通过QPixmap来加载视频帧,并将其设置为QLabel的图像。 5. 实现一个函数,该函数将读取视频文件,并将其转换为一系列的视频帧。你可以使用OpenCV库来读取和处理视频。 6. 在主窗口的构造函数中,调用该函数并启动QTimer来定时更新视频帧。 7. 运行应用程序并观看视频在QLabel上的播放。 注意:这只是一个大致的步骤指导,具体实现可能需要根据你的需求进行调整和修改。你可以参考中提供的代码示例来更好地理解并实现这个功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [PyQt5利用QLabel全屏显示USB摄像头视频流](https://blog.csdn.net/qq_20373723/article/details/124211225)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Pyqt5:使用Qlabel标签进行视频播放](https://blog.csdn.net/qq_48764574/article/details/123909225)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [PyQt -- QLabel显示视频文件](https://blog.csdn.net/weixin_39681486/article/details/118290348)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如雾如电

随缘

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值