使用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 建立包含相機饋送的令人印象深刻的桌面應用程式。
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP