PyQt5 + PaddleOCR实战:打造桌面级实时文字识别工具

发布时间:2026/5/17 19:54:13

PyQt5 + PaddleOCR实战:打造桌面级实时文字识别工具 一、引言1.1 项目背景想象这样一个场景你正在阅读一本外文书籍遇到不认识的单词需要打开手机拍照翻译或者你需要快速提取屏幕上的文字信息却只能手动输入...如果有一个工具只需打开摄像头对准文字就能实时识别并显示出来是不是很方便今天我们就用Python来实现这个想法通过整合PyQt5GUI框架、PaddleOCR文字识别引擎和OpenCV计算机视觉库打造一个桌面级的实时文字识别工具。1.2 最终效果展示左侧实时摄像头画面用紫色框标注识别到的文字区域右侧识别出的文字列表按行显示底部一个“打开/关闭”按钮控制摄像头1.3 技术栈技术用途版本建议Python开发语言3.8PyQt5图形界面5.15.0PaddleOCR文字识别2.6.0OpenCV图像处理4.5.0PyInstaller打包工具5.0可选二、环境搭建2.1 安装依赖库打开终端执行以下命令# 基础库安装 pip install PyQt5 pip install opencv-python pip install numpy ​ # PaddleOCR安装CPU版本 pip install paddlepaddle pip install paddleocr ​ # 如需GPU加速NVIDIA显卡专用 # pip install paddlepaddle-gpu2.2 验证安装创建一个测试文件确认所有库都能正常导入import sys import cv2 import numpy as np from PyQt5 import QtWidgets from paddleocr import PaddleOCR ​ print(所有库导入成功) print(fOpenCV版本: {cv2.__version__}) print(fNumPy版本: {np.__version__})三、界面设计使用Qt Designer3.1 界面布局设计我们设计的界面非常简单直观3.2 使用Qt Designer创建界面如果你不熟悉代码布局推荐使用Qt Designer可视化设计打开Qt Designer创建Main Window拖入控件一个QLabel用于显示摄像头画面一个QTextEdit用于显示识别结果一个QPushButton控制开关保存为ocr.ui文件3.3 转换为Python代码pyuic5 ocr.ui -o ocr_ui.py生成的ocr_ui.py文件就是我们之前看到的Ui_MainWindow类。四、核心代码详解4.1 项目结构ocr_project/ ├── main.py # 主程序入口 ├── ocr_ui.py # 界面代码自动生成 ├── resources/ # 资源文件如图标 └── README.md # 说明文档4.2 主程序完整代码解析4.2.1 导入模块与路径设置import os import sys ​ # 解决Qt插件路径问题重要避免打包后找不到插件 if hasattr(sys, frozen): # 打包后的exe运行环境 os.environ[QT_QPA_PLATFORM_PLUGIN_PATH] os.path.join(sys._MEIPASS, PyQt5, Qt, plugins) else: # 开发环境直接运行py文件 import PyQt5 qt_plugins_path os.path.join(os.path.dirname(PyQt5.__file__), Qt5, plugins) os.environ[QT_QPA_PLATFORM_PLUGIN_PATH] qt_plugins_path ​ import cv2 import numpy as np from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import QFileDialog, QMainWindow, QMessageBox from paddleocr import PaddleOCR from ocr_ui import Ui_MainWindow # 导入自动生成的界面类4.2.2 主窗口类定义class PyQtMainEntry(QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) # 初始化界面 # 初始化OCR引擎 # use_angle_cls: 启用方向分类自动校正旋转的文字 # use_gpu: 使用GPU加速有NVIDIA显卡且安装了GPU版可设为True # show_log: 是否显示详细日志 # lang: 识别语言en英文ch中文ch,en中英文混合 self.ocr PaddleOCR(use_angle_clsTrue, use_gpuFalse, show_logFalse, langen) # 打开摄像头0表示默认摄像头可以改为视频文件路径 self.camera cv2.VideoCapture(0) # 摄像头状态标志 self.is_camera_opened False # 创建定时器用于循环读取摄像头画面 self.timer QtCore.QTimer(self) self.timer.timeout.connect(self.update_frame) # 连接超时信号到更新函数 self.timer.setInterval(30) # 30毫秒更新一次约33帧/秒 # 连接按钮点击事件 self.pushButton.clicked.connect(self.toggle_camera)4.2.3 摄像头控制功能def toggle_camera(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() # 停止定时器 # 清空显示 self.label.clear() self.textEdit.clear()4.2.4 核心画面更新与OCR识别def update_frame(self): 定时器触发函数读取摄像头画面并进行OCR识别 # 第一步读取摄像头画面 ret, frame self.camera.read() if not ret: print(无法读取摄像头画面) return # 保存原始帧用于OCR识别保持原分辨率以保证识别效果 self.current_frame frame.copy() # 调整显示大小640x480适合大多数屏幕 display_frame cv2.resize(frame, (640, 480)) # 第二步执行OCR识别 try: # 调用PaddleOCR进行识别 result self.ocr.ocr(self.current_frame, clsTrue) # 解析识别结果 if result[0] is not None: text_list [] for line in result[0]: # line[0]是文本框坐标line[1][0]是识别的文字line[1][1]是置信度 text line[1][0] confidence line[1][1] text_list.append(f{text} ({confidence:.2f})) # 在画面上绘制文本框可选这里为了清晰度先不做 # 如果要绘制需要将坐标按比例缩放到显示画面 # 更新右侧文本显示区 self.textEdit.setText(\n.join(text_list)) else: self.textEdit.setText(未检测到文字) except Exception as e: print(fOCR识别出错: {e}) self.textEdit.setText(识别出错) # 第三步将OpenCV图像转换为Qt图像并显示 self.display_image(display_frame) ​ def display_image(self, cv_image): 将OpenCV图像转换为Qt图像并显示在label上 # OpenCV使用BGR颜色空间Qt使用RGB需要转换 rgb_image cv2.cvtColor(cv_image, cv2.COLOR_BGR2RGB) # 获取图像尺寸 height, width, channel rgb_image.shape bytes_per_line 3 * width # 创建QImage对象 qt_image QtGui.QImage(rgb_image.data, width, height, bytes_per_line, QtGui.QImage.Format_RGB888) # 转换为QPixmap并缩放到label大小保持宽高比 pixmap QtGui.QPixmap.fromImage(qt_image) scaled_pixmap pixmap.scaled(self.label.size(), QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) # 显示在label上 self.label.setPixmap(scaled_pixmap)4.2.5 程序入口if __name__ __main__: # 创建Qt应用程序 app QtWidgets.QApplication(sys.argv) # 创建主窗口 window PyQtMainEntry() window.show() # 进入事件循环 sys.exit(app.exec_())五、功能演示与使用说明5.1 使用步骤启动程序出现主窗口按钮显示“打开摄像头”开启识别点击按钮摄像头启动实时画面显示在左侧对准文字将摄像头对准书本、屏幕或任何含有文字的区域查看结果右侧文本框实时显示识别出的文字关闭程序再次点击按钮关闭摄像头或直接关闭窗口5.2 效果优化建议调整识别语言修改langch识别中文提高识别速度设置use_gpuTrue需要GPU版本降低CPU占用将定时器间隔改为50mssetInterval(50)提高识别准确率添加图像预处理灰度化、二值化等六、常见问题与解决方案6.1 Qt平台插件找不到错误qt.qpa.plugin: Could not find the Qt platform plugin windows解决方案# 在导入PyQt5之前添加 import os import PyQt5 os.environ[QT_QPA_PLATFORM_PLUGIN_PATH] os.path.join( os.path.dirname(PyQt5.__file__), Qt5, plugins )6.2 图像颜色显示异常现象摄像头画面颜色偏蓝或偏红原因OpenCV使用BGR格式Qt使用RGB格式解决rgb_image cv2.cvtColor(bgr_image, cv2.COLOR_BGR2RGB)6.3 识别速度慢优化方案降低识别分辨率将图像缩小后再识别跳帧处理每2-3帧识别一次使用GPU加速安装GPU版PaddlePaddle# 跳帧示例 frame_count 0 def update_frame(self): global frame_count frame_count 1 if frame_count % 3 ! 0: # 每3帧识别一次 return # ... 识别代码 ...6.4 内存占用过高原因定时器频率太高图像转换频繁解决适当增加定时器间隔self.timer.setInterval(50) # 改为50毫秒通过本文我们从一个想法出发逐步构建了一个功能完整的桌面OCR识别工具。从界面设计到核心功能实现从问题调试到最终打包相信你已经掌握了PyQt5PaddleOCR开发桌面应用的全流程。这个项目不仅实用更是一个很好的Python GUI开发练手项目。你可以在此基础上不断扩展加入自己的想法打造出属于你自己的独特工具。如果在开发过程中遇到任何问题欢迎在评论区留言交流。也期待看到你的改进版本

相关新闻