实时英文 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, QtWidgets
class 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.translate
MainWindow.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, QMessageBox
from untitled6 import Ui_MainWindow # 导入UI类
import sys
class 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 = False
self._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_opened
if 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 技术。