使用Pyqt5创建相机应用程序
PyQt5 是 Python 最流行的 GUI 库之一,它允许开发人员轻松创建桌面应用程序。在本教程中,我们将逐步介绍使用 PyQt5 创建相机应用程序的过程。该相机应用程序将允许用户拍照、查看照片,甚至保存照片。
PyQt5 的优势是什么?
PyQt5 是流行的跨平台 GUI 工具包 Qt 的 Python 绑定。以下是 PyQt5 的一些优势:
跨平台 − PyQt5 是一个跨平台工具包,这意味着使用它开发的应用程序可以在多个平台上运行,例如 Windows、Mac OS X 和 Linux。
丰富的部件集 − PyQt5 带有一套丰富的部件,包括按钮、标签、文本框、表格等等。这使得创建复杂的图形用户界面变得容易。
高性能 − PyQt5 通过 OpenGL 集成提供高性能的图形渲染。这使得即使在处理大量数据时也能获得流畅且响应迅速的 GUI。
易于学习 − PyQt5 建立在 Python 编程语言之上,Python 以其简单易用而闻名。这使得开发人员可以轻松地在项目中学习和使用 PyQt5。
开源 − PyQt5 是一个开源项目,这意味着开发人员可以访问其源代码并为其开发做出贡献。这也意味着 PyQt5 可免费使用,无需任何许可费用。
庞大的社区 − PyQt5 拥有庞大的开发人员和用户社区,他们积极参与其开发和支持。这使得在项目中使用 PyQt5 时,可以轻松找到帮助、文档和示例。
总的来说,PyQt5 是一个功能强大且灵活的工具包,用于使用 Python 开发跨平台图形用户界面。
先决条件
在我们深入任务之前,需要在您的系统上安装一些东西:
推荐设置列表:
pip install pyqt5, open-cv, numpy
预计用户可以使用任何独立的 IDE,例如 VS-Code、PyCharm、Atom 或 Sublime text。
也可以使用在线 Python 编译器,例如 Kaggle.com、Google Cloud Platform 或其他任何编译器。
更新版本的 Python。在撰写本文时,我使用了 3.10.9 版本。
了解如何使用 Jupyter notebook。
虚拟环境的知识和应用将是有益的,但不是必需的。
还期望用户对统计学和数学有很好的理解。
安装所需的库
第一步是确保安装了所有必要的库。我们需要 PyQt5、OpenCV 和 NumPy 来创建相机应用程序。可以使用以下命令安装所需的库。
语法
pip install PyQt5 pip install opencv-python-headless pip install numpy
创建主窗口
主窗口是任何应用程序的支柱。所有用户界面元素都将放置在此处。在这个相机应用程序中,我们将创建一个主窗口,其中包含相机馈送、一个用于捕获照片的按钮和一个用于保存照片的按钮。
要创建主窗口,我们将创建一个新的 PyQt5 项目并导入所需的库。
import sys import cv2 import numpy as np from PyQt5.QtCore import Qt, QTimer, QThread, pyqtSignal from PyQt5.QtGui import QImage, QPixmap from PyQt5.QtWidgets import QApplication, QDialog, QMainWindow, QStatusBar, QToolBar, QAction, QFileDialog, QLabel
接下来,我们将创建一个 QMainWindow 并设置窗口标题、状态栏和工具栏。
class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Camera Application") self.statusBar().showMessage("Ready") self.toolbar = QToolBar() self.addToolBar(self.toolbar) self.label = QLabel() self.label.setAlignment(Qt.AlignCenter) self.setCentralWidget(self.label)
我们还将添加一个 QLabel 来显示相机馈送。
self.camera = CameraThread() self.camera.image.connect(self.update_image) self.camera.start() capture_action = QAction("Capture", self.toolbar) capture_action.setShortcut("Space") capture_action.triggered.connect(self.capture_photo) self.toolbar.addAction(capture_action)
捕获和保存照片
要捕获照片,我们将创建一个 QAction 并将其连接到一个方法,该方法将捕获来自相机馈送的当前帧。
def update_image(self, frame): frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) image = QImage(frame, frame.shape[1], frame.shape[0], QImage.Format_RGB888) self.label.setPixmap(QPixmap.fromImage(image)) def capture_photo(self): frame = self.camera.frame frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) image = QImage(frame, frame.shape[1], frame.shape[0], QImage.Format_RGB888) filename, _ = QFileDialog.getSaveFileName(self, "Save Photo", "", "JPEG Image (*.jpg)") if filename: image.save(filename, "jpg")
capture_photo 方法将捕获来自相机馈送的当前帧,将其转换为 QImage,并使用 QFileDialog 将其保存到文件中。
创建相机线程
我们将使用单独的线程来捕获来自相机的视频馈送。这是为了防止在捕获视频馈送时 GUI 冻结。
class CameraThread(QThread): image = pyqtSignal(np.ndarray) def __init__(self): super().__init__() self.capture = None def start_capture(self): self.capture = cv2.VideoCapture(0) def stop_capture(self): if self.capture: self.capture.release() self.capture = None def run(self): self.start_capture() while True: ret, frame = self.capture.read() if ret: self.image.emit(frame) def stop(self): self.stop_capture() super().stop()
最终程序,代码
让我们检查下面最终的和附加的代码
import sys import cv2 import numpy as np from PyQt5.QtCore import Qt, QTimer, QThread, pyqtSignal from PyQt5.QtGui import QImage, QPixmap from PyQt5.QtWidgets import QApplication, QDialog, QMainWindow, QStatusBar, QToolBar, QAction, QFileDialog, QLabel class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Camera Application") self.statusBar().showMessage("Ready") self.toolbar = QToolBar() self.addToolBar(self.toolbar) self.label = QLabel() self.label.setAlignment(Qt.AlignCenter) self.setCentralWidget(self.label) self.camera = CameraThread() self.camera.image.connect(self.update_image) self.camera.start() capture_action = QAction("Capture", self.toolbar) capture_action.setShortcut("Space") capture_action.triggered.connect(self.capture_photo) self.toolbar.addAction(capture_action) def update_image(self, frame): frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) image = QImage(frame, frame.shape[1], frame.shape[0], QImage.Format_RGB888) self.label.setPixmap(QPixmap.fromImage(image)) def capture_photo(self): frame = self.camera.frame frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) image = QImage(frame, frame.shape[1], frame.shape[0], QImage.Format_RGB888) filename, _ = QFileDialog.getSaveFileName(self, "Save Photo", "", "JPEG Image (*.jpg)") if filename: image.save(filename, "jpg") class CameraThread(QThread): image = pyqtSignal(np.ndarray) def __init__(self): super().__init__() self.capture = None def start_capture(self): self.capture = cv2.VideoCapture(0) def stop_capture(self): if self.capture: self.capture.release() self.capture = None def run(self): self.start_capture() while True: ret, frame = self.capture.read() if ret: self.image.emit(frame) def stop(self): self.stop_capture() super().stop()
输出
由于隐私规则,此程序仅以图像形式生成输出,我无法提供我的图像,除此之外,人们可能由于以下原因难以获得输出。因此,读者应牢记以下可能的错误。
相机未正确连接或无法正常工作。请确保相机已正确连接并正常工作。
程序无权访问相机。检查您的系统设置以确保程序有权访问相机。
程序配置不正确。检查代码以确保相机设置和 PyQt5 信号已正确设置。
正在使用的 OpenCV 版本可能存在问题。尝试更新或重新安装 OpenCV。
正在使用的 PyQt5 版本可能存在问题。尝试更新或重新安装 PyQt5。
结论
在本教程中,我们了解了如何使用 Pyqt5 创建相机应用程序。我们介绍了安装必要的库、创建主窗口、创建相机线程、显示相机馈送以及捕获/保存照片。有了这些知识,任何开发人员都可以使用 Pyqt5 创建包含相机馈送的令人印象深刻的桌面应用程序。