實時英文 OCR 文字識別:從攝像頭到 PyQt5 界面的實現
引言
在數字化時代,文字識別技術(OCR)在眾多領域中發揮著重要作用。無論是文檔掃描、車牌識別還是實時視頻流中的文字提取,OCR 技術都能提供高效且準確的解決方案。本文將介紹如何使用 Python 和 PaddleOCR 實現從攝像頭捕獲視頻流并實時識別其中的英文文字,同時將結果顯示在 PyQt5 界面中。
技術棧
- PaddleOCR:百度開源的 OCR 工具,支持多種語言的文字識別。
- OpenCV:用于圖像處理和視頻流操作。
- PyQt5:用于創建圖形用戶界面(GUI)。
- Python:作為主要編程語言。
環境準備
在開始之前,確保你的環境中安裝了以下必要的庫:
pip install paddlepaddle paddleocr opencv-python PyQt5
實現步驟
1. 創建 PyQt5 界面
首先,我們需要創建一個簡單的 PyQt5 界面,用于顯示攝像頭視頻流和識別結果。界面包含一個視頻顯示區域、一個文本顯示區域和一個控制按鈕。
文件 1:untitled6.py
# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'untitled6.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(1273, 877)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")# 創建一個 QLabel 用于顯示攝像頭視頻流self.label = QtWidgets.QLabel(self.centralwidget)self.label.setGeometry(QtCore.QRect(240, 60, 501, 261))self.label.setText("")self.label.setObjectName("label")# 創建一個 QPushButton 用于控制攝像頭的開關self.pushButton = QtWidgets.QPushButton(self.centralwidget)self.pushButton.setGeometry(QtCore.QRect(450, 490, 93, 51))self.pushButton.setObjectName("pushButton")# 創建一個 QTextEdit 用于顯示 OCR 識別結果self.textEdit = QtWidgets.QTextEdit(self.centralwidget)self.textEdit.setGeometry(QtCore.QRect(973, 6, 301, 581))self.textEdit.setObjectName("textEdit")MainWindow.setCentralWidget(self.centralwidget)self.menubar = QtWidgets.QMenuBar(MainWindow)self.menubar.setGeometry(QtCore.QRect(0, 0, 1273, 26))self.menubar.setObjectName("menubar")MainWindow.setMenuBar(self.menubar)self.statusbar = QtWidgets.QStatusBar(MainWindow)self.statusbar.setObjectName("statusbar")MainWindow.setStatusBar(self.statusbar)self.retranslateUi(MainWindow)QtCore.QMetaObject.connectSlotsByName(MainWindow)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "OCR Camera"))self.pushButton.setText(_translate("MainWindow", "打開"))
2. 實現主程序邏輯
接下來,我們實現主程序邏輯,包括初始化 PaddleOCR、捕獲攝像頭視頻流、進行 OCR 識別并將結果顯示在 PyQt5 界面中。
文件 2:ocrCap.py
from paddleocr import PaddleOCR
import cv2
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QMessageBoxfrom untitled6 import Ui_MainWindow # 導入UI類import sysclass PyQtMainEntry(QMainWindow, Ui_MainWindow):def __init__(self):super().__init__()self.setupUi(self)# 初始化 PaddleOCR,設置為英文識別self.ocr = PaddleOCR(use_angle_cls=True, use_gpu=True, show_log=False,det_model_dir='en_PP-OCRv3_det_infer',rec_model_dir='en_PP-OCRv3_rec_infer',cls_model_dir='ch_ppocr_mobile_v2.0_cls_slim_infer',lang="en")# 初始化攝像頭self.camera1 = cv2.VideoCapture(0)self.is_camera_opened = Falseself._timer = QtCore.QTimer(self)self._timer.timeout.connect(self._queryFrame)self._timer.setInterval(30)self.pushButton.clicked.connect(self.slot1)def slot1(self):# 控制攝像頭的開關self.is_camera_opened = not self.is_camera_openedif self.is_camera_opened:self.pushButton.setText("關閉")self._timer.start()else:self.pushButton.setText("打開")self._timer.stop()def _queryFrame(self):# 從攝像頭讀取一幀ret1, self.frame1 = self.camera1.read()if ret1:# 調整幀大小self.frame11 = cv2.resize(self.frame1, (640, 480))qimage = cv2.cvtColor(self.frame11, cv2.COLOR_BGR2RGB)qimage = QtGui.QImage(qimage.data, qimage.shape[1], qimage.shape[0],QtGui.QImage.Format_RGB888)pixmap = QtGui.QPixmap.fromImage(qimage)self.label.setPixmap(pixmap)# 進行 OCR 識別result = self.ocr.ocr(self.frame1, cls=True)if result is not None:a_list = [line[1][0] for line in result[0]]zz = '\n'.join(a_list)self.textEdit.setText(zz)else:self.textEdit.setText("未檢測到文本")if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)window = PyQtMainEntry()window.show()sys.exit(app.exec_())
3. 代碼解釋
-
PaddleOCR 初始化:
use_angle_cls=True
:啟用角度分類器,用于處理旋轉文本。use_gpu=True
:使用 GPU 加速,提高識別速度。show_log=False
:關閉日志輸出,避免不必要的信息干擾。det_model_dir
、rec_model_dir
、cls_model_dir
:指定模型文件路徑。lang="en"
:設置識別語言為英文。
-
視頻流捕獲:
- 使用
cv2.VideoCapture(0)
捕獲默認攝像頭的視頻流。 - 每次循環讀取一幀,并進行 OCR 識別。
- 使用
-
OCR 識別:
ocr.ocr(frame, cls=True)
:對當前幀進行 OCR 識別,返回識別結果。- 遍歷識別結果,提取文本框的四個角點,并繪制文本框。
- 提取識別的文本內容,并在文本框左上角位置顯示。
-
顯示結果:
- 使用
cv2.imshow
顯示處理后的視頻幀。 - 按下 ‘q’ 鍵退出程序,并釋放攝像頭資源。
- 使用
4. 運行程序
最后,運行程序并查看效果:
python ocrCap.py
總結
通過上述步驟,我們成功地實現了一個從攝像頭捕獲視頻流并實時識別其中英文文字的程序,并將結果顯示在 PyQt5 界面中。這個項目不僅可以用于學習和研究,還可以應用于實際場景,如實時文檔掃描、車牌識別等。希望這篇文章能幫助你更好地理解和應用 OCR 技術。