栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

PyQt显示来自opencv的视频流

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PyQt显示来自opencv的视频流

问题是获取图像的功能仅执行一次,而不更新标签。
正确的方法是将其放置在循环中,但会导致阻塞主窗口。主窗口的这种阻塞可以通过使用

QThread
类来解决,并通过信号发送
QImage
来更新标签。例如:

import cv2import sysfrom PyQt5.QtWidgets import  QWidget, QLabel, QApplicationfrom PyQt5.QtCore import QThread, Qt, pyqtSignal, pyqtSlotfrom PyQt5.QtGui import QImage, QPixmapclass Thread(QThread):    changePixmap = pyqtSignal(QImage)    def run(self):        cap = cv2.VideoCapture(0)        while True: ret, frame = cap.read() if ret:     # https://stackoverflow.com/a/55468544/6622587     rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)     h, w, ch = rgbImage.shape     bytesPerLine = ch * w     convertToQtFormat = QImage(rgbImage.data, w, h, bytesPerLine, QImage.Format_RGB888)     p = convertToQtFormat.scaled(640, 480, Qt.KeepAspectRatio)     self.changePixmap.emit(p)class App(QWidget):    def __init__(self):        super().__init__()        [...]        self.initUI()    @pyqtSlot(QImage)    def setImage(self, image):        self.label.setPixmap(QPixmap.fromImage(image))    def initUI(self):        self.setWindowTitle(self.title)        self.setGeometry(self.left, self.top, self.width, self.height)        self.resize(1800, 1200)        # create a label        self.label = QLabel(self)        self.label.move(280, 120)        self.label.resize(640, 480)        th = Thread(self)        th.changePixmap.connect(self.setImage)        th.start()        self.show()


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/660760.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号