使用Pyqt5创建相机应用程序

使用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文本。

  • 即使在线Python编译器也可以使用,如Kaggle.com、Google Cloud平台或任何其他编译器。

  • 已更新的Python版本。在撰写本文时,我使用的是3.10.9版本。

  • 熟悉使用Jupyter笔记本电脑的方法。

  • 了解和应用虚拟环境将是有益的,但不是必需的。

  • 还预计该人会对统计学和数学有很好的理解。

安装所需的库

第一步是确保安装了所有必要的库。我们将需要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("摄像头应用程序")
      self.statusBar().showMessage("准备就绪")
      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("捕捉", self.toolbar)
   capture_action.setShortcut("空格键")

   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, "保存照片", "", "JPEG 图像 (*.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("摄像头应用程序")
      self.statusBar().showMessage("准备就绪")
      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("拍照", self.toolbar)
      capture_action.setShortcut("空格")

      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, "保存照片", "", "JPEG图像 (*.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创建令人印象深刻的桌面应用程序,其中涉及到摄像头视图。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程