首页 > 解决方案 > 如何在 PyQt5 制作的 GUI 窗口中显示来自 picamera 的实时预览?

问题描述

我正在设计一个 GUI 来从 picamera 捕获图像,我正在使用 PyQt5 来开发 GUI。我使用 camera.start_preview() 函数来查看实时预览。之后,我使用了一个名为“Take”的按钮来捕获图像,在捕获图像后,我使用 self.label_2.setPixmap(QtGui.QPixmap()) 命令在 Qlabel 中显示了图像,直到我的代码工作正常。现在我想将 PiCamera 的实时预览设置为同一个 Qlabel,我用它来显示捕获的图像。是否可以在 QLabel 中设置实时预览?

谷歌搜索后,我发现 PIL 可用于在窗口内流式传输实时预览,但我不知道如何实现它。

from PyQt5 import QtCore, QtGui, QtWidgets
from picamera import PiCamera
import time
from time import sleep
import gpiozero
from gpiozero import Button
from PIL import Image
import cups
import os

camera = PiCamera()
camera.sensor_mode = 2
camera.brightness = 70
camera.contrast = 20

photoHeight = 1944
photoWidth = 2592


class clsPicCount(object):
    countpic=0
    def __init__(self):
        clsPicCount.countpic=clsPicCount.countpic+1
        if clsPicCount.countpic > 1:
            clsPicCount.countpic = 0


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1366, 768)
        MainWindow.setMinimumSize(QtCore.QSize(1366, 768))
        MainWindow.setMaximumSize(QtCore.QSize(1366, 768))
        font = QtGui.QFont()
        font.setUnderline(False)
        font.setStrikeOut(False)
        MainWindow.setFont(font)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("Photo.png"), QtGui.QIcon.Normal, QtGui.QIcon.On)
        MainWindow.setWindowIcon(icon)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.retake = QtWidgets.QPushButton(self.centralwidget)
        self.retake.setGeometry(QtCore.QRect(320, 680, 211, 71))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(14)
        font.setBold(True)
        font.setWeight(75)
        self.retake.setFont(font)
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap("retake.png"), QtGui.QIcon.Normal, QtGui.QIcon.On)
        self.retake.setIcon(icon1)
        self.retake.setIconSize(QtCore.QSize(50, 50))
        self.retake.setObjectName("retake")
        self.take = QtWidgets.QPushButton(self.centralwidget)
        self.take.setGeometry(QtCore.QRect(550, 680, 211, 71))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(14)
        font.setBold(True)
        font.setWeight(75)
        self.take.setFont(font)
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap("take.png"), QtGui.QIcon.Normal, QtGui.QIcon.On)
        self.take.setIcon(icon2)
        self.take.setIconSize(QtCore.QSize(60, 60))
        self.take.setObjectName("take")
        self.print = QtWidgets.QPushButton(self.centralwidget)
        self.print.setGeometry(QtCore.QRect(780, 680, 211, 71))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(14)
        font.setBold(True)
        font.setWeight(75)
        self.print.setFont(font)
        icon3 = QtGui.QIcon()
        icon3.addPixmap(QtGui.QPixmap("print.png"), QtGui.QIcon.Normal, QtGui.QIcon.On)
        self.print.setIcon(icon3)
        self.print.setIconSize(QtCore.QSize(50, 50))
        self.print.setCheckable(True)
        self.print.setObjectName("print")
        self.settings = QtWidgets.QPushButton(self.centralwidget)
        self.settings.setGeometry(QtCore.QRect(1220, 690, 121, 51))
        font = QtGui.QFont()
        font.setPointSize(8)
        font.setBold(True)
        font.setWeight(75)
        self.settings.setFont(font)
        icon4 = QtGui.QIcon()
        icon4.addPixmap(QtGui.QPixmap("settings.png"), QtGui.QIcon.Normal, QtGui.QIcon.On)
        self.settings.setIcon(icon4)
        self.settings.setIconSize(QtCore.QSize(30, 30))
        self.settings.setObjectName("settings")
        self.heading = QtWidgets.QLabel(self.centralwidget)
        self.heading.setGeometry(QtCore.QRect(390, 20, 581, 31))
        self.heading.setObjectName("heading")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(230, 70, 900, 600))
        self.label_2.setText("")
        self.label_2.setPixmap(QtGui.QPixmap("photobooth.jpg"))
        self.label_2.setScaledContents(True)
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(0, 0, 1361, 771))
        self.label_3.setText("")
        self.label_3.setPixmap(QtGui.QPixmap("background.png"))
        self.label_3.setObjectName("label_3")
        self.label_3.raise_()
        self.retake.raise_()
        self.take.raise_()
        self.print.raise_()
        self.settings.raise_()
        self.heading.raise_()
        self.label_2.raise_()
        MainWindow.setCentralWidget(self.centralwidget)

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

       #Defining functions of our buttons

        self.take.clicked.connect(self.startPreview)

        #Initializing Printer

        conn = cups.Connection ()
        printers = conn.getPrinters ()
        printer_name = list(printers)[0]
        for printer in printers:
            print (printer, printers[printer]["device-uri"])

        #Code Block for live preview and image capture


        def startPreview(self):

        p=clsPicCount()
        print(clsPicCount.countpic)

        if clsPicCount.countpic == 1:
            camera.start_preview(fullscreen=False, window=(10,0,320,240))
        else:
            filename = time.strftime("%Y%m%d-%H%M%S")
            print (filename)
            camera.capture('/home/pi/Desktop/%s.jpg'%filename, resize = (photoWidth, photoHeight))
            camera.stop_preview()
            self.label_2.setPixmap(QtGui.QPixmap('/home/pi/Desktop/%s.jpg'%filename))
            self.label_2.setScaledContents(True)
            #self.label_3.raise_()


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "PhotoBooth"))
        self.retake.setText(_translate("MainWindow", "RETAKE"))
        self.take.setText(_translate("MainWindow", "TAKE"))
        self.print.setText(_translate("MainWindow", "PRINT"))
        self.settings.setText(_translate("MainWindow", "SETTINGS"))
        self.heading.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\"><span style=\" font-size:14pt; font-weight:600; color:#ffffff;\">TECH MECH SERVICES PVT LTD.</span></p></body></html>"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

标签: pythonpyqtraspberry-pipyqt5raspberry-pi3

解决方案


推荐阅读