python - 如何在 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_())
解决方案
推荐阅读
- shell - 设置环境变量然后在 Jenkins Scripted Pipeline 中运行脚本
- c++ - 将一个函数传递给 C++ 中的另一个函数,其中参数的数量可以不同
- sass - Sass Mixin 返回什么?
- java - 如何创建数据并将数据输入到 BubbleSortable(接口)对象中?
- gridview - 如何让 Flutter GridView 在滚动时变成分页?
- javascript - 验证在使用 withFormik 的 handleSubmit 时单击按钮时调用了模拟函数
- python - 在 Python Selenium 中为下拉菜单选择元素
- google-maps - 更改谷歌地图 iframe 语言
- mysql - 使用 MySQL 替换多个字符
- laravel-5 - 如何使用 eloquent 或查询生成器提交以下数组的批量记录