一个python写的可视化本地处理的OCR

查看 69|回复 10
作者:liudewensss   
一个python写的可视化本地处理的OCR


154225viipi5mcbvi7ro7g.png (60.15 KB, 下载次数: 0)
下载附件
2025-1-10 18:58 上传

可以单个处理图片,也可以选择文件夹批量处理,完全本地cpu处理
需要用到的python库
[Python] 纯文本查看 复制代码pip install PyQt5
pip install opencv-python
pip install paddleocr
pip install numpy
pip install pillow
pip install pyperclip
python版本    3.8或者3.9
python下载地址:https://www.python.org/downloads/windows/
python代码
[Python] 纯文本查看 复制代码import sys
import os
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QHBoxLayout, QWidget, QFileDialog, QTextEdit, QLabel, QMessageBox, QProgressBar
from PyQt5.QtGui import QPixmap, QImage
from PyQt5.QtCore import Qt, QThread, pyqtSignal
import cv2
from paddleocr import PaddleOCR
import numpy as np
from PIL import Image
import pyperclip
class OCRThread(QThread):
    progress_update = pyqtSignal(int)
    result_ready = pyqtSignal(list)
    def __init__(self, ocr, file_list):
        super().__init__()
        self.ocr = ocr
        self.file_list = file_list
    def run(self):
        results = []
        for i, file in enumerate(self.file_list):
            try:
                result = self.ocr.ocr(file, cls=True)
                results.append((os.path.basename(file), result))
            except Exception as e:
                results.append((os.path.basename(file), None))
                print(f"处理文件 {file} 时出错: {str(e)}")
            self.progress_update.emit(int((i + 1) / len(self.file_list) * 100))
        self.result_ready.emit(results)
class OCRApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.ocr = PaddleOCR(use_angle_cls=True, lang="ch")
        self.current_image = None
    def initUI(self):
        self.setWindowTitle('OCR应用')
        
        fixed_width = 400
        fixed_height = 500
        self.setFixedSize(fixed_width, fixed_height)
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        main_layout = QVBoxLayout()
        central_widget.setLayout(main_layout)
        self.image_label = QLabel(self)
        self.image_label.setAlignment(Qt.AlignCenter)
        self.image_label.setFixedSize(fixed_width - 20, 200)
        main_layout.addWidget(self.image_label)
        button_layout = QHBoxLayout()
        self.open_file_button = QPushButton('选择图片', self)
        self.open_file_button.clicked.connect(self.open_file)
        button_layout.addWidget(self.open_file_button)
        self.open_folder_button = QPushButton('选择文件夹', self)
        self.open_folder_button.clicked.connect(self.open_folder)
        button_layout.addWidget(self.open_folder_button)
        self.copy_button = QPushButton('复制内容', self)
        self.copy_button.clicked.connect(self.copy_content)
        button_layout.addWidget(self.copy_button)
        main_layout.addLayout(button_layout)
        self.progress_bar = QProgressBar(self)
        self.progress_bar.setVisible(False)
        main_layout.addWidget(self.progress_bar)
        self.result_text = QTextEdit(self)
        self.result_text.setReadOnly(True)
        main_layout.addWidget(self.result_text)
    def open_file(self):
        file_name, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "图片文件 (*.png *.jpg *.bmp)")
        if file_name:
            self.process_image(file_name)
    def open_folder(self):
        directory = QFileDialog.getExistingDirectory(self, "选择文件夹")
        if directory:
            files = [os.path.join(directory, f) for f in os.listdir(directory) if f.lower().endswith(('.png', '.jpg', '.bmp'))]
            if files:
                self.process_multiple_images(files)
            else:
                QMessageBox.warning(self, "提示", "文件夹中没有符合条件的图片文件。")
    def process_image(self, file_name):
        self.current_image = cv2.imread(file_name)
        if self.current_image is None:
            QMessageBox.warning(self, "错误", "无法加载图片,文件可能已损坏或格式不支持。")
            return
        
        self.display_image(self.current_image)
        try:
            result = self.ocr.ocr(file_name, cls=True)
            self.display_result([(os.path.basename(file_name), result)])
        except Exception as e:
            QMessageBox.warning(self, "错误", f"OCR处理失败: {str(e)}")
    def process_multiple_images(self, files):
        self.progress_bar.setVisible(True)
        self.progress_bar.setValue(0)
        
        self.ocr_thread = OCRThread(self.ocr, files)
        self.ocr_thread.progress_update.connect(self.update_progress)
        self.ocr_thread.result_ready.connect(self.display_result)
        self.ocr_thread.start()
    def update_progress(self, value):
        self.progress_bar.setValue(value)
    def display_image(self, img):
        height, width, channel = img.shape
        bytes_per_line = 3 * width
        q_img = QImage(img.data, width, height, bytes_per_line, QImage.Format_RGB888).rgbSwapped()
        pixmap = QPixmap.fromImage(q_img)
        
        label_width = self.image_label.width()
        label_height = self.image_label.height()
        scale = min(label_width / width, label_height / height)
        
        new_width = int(width * scale)
        new_height = int(height * scale)
        
        scaled_pixmap = pixmap.scaled(new_width, new_height, Qt.KeepAspectRatio, Qt.SmoothTransformation)
        self.image_label.setPixmap(scaled_pixmap)
    def display_result(self, results):
        self.result_text.clear()
        for file_name, result in results:
            self.result_text.append(f"文件: {file_name}")
            if result and len(result) > 0 and result[0]:
                try:
                    sorted_result = sorted(result[0], key=lambda x: (x[0][0][1], x[0][0][0]))
                    for line in sorted_result:
                        text = line[1][0]
                        self.result_text.append(text)
                except Exception as e:
                    self.result_text.append(f"解析结果时出错: {str(e)}")
            else:
                self.result_text.append("未识别到文本")
            self.result_text.append("\n")
        
        self.progress_bar.setVisible(False)
        if len(results) > 1:
            QMessageBox.information(self, "完成", f"已完成 {len(results)} 个文件的识别")
    def copy_content(self):
        content = self.result_text.toPlainText()
        pyperclip.copy(content)
        QMessageBox.information(self, "提示", "内容已复制到剪贴板")
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = OCRApp()
    ex.show()
    sys.exit(app.exec_())
电脑环境没打包成功,没技术的小白

文件, 图片

flyer_2001   

支持原创,感谢分享!
y5230024   

打包要在pyinstaller配置文件中加入模型文件,以前我打包ddddocr的时候也遇到过打包失败的问题
wsasecy   

  各位可以不觉得,不过我是觉得楼主阔以的。
lengkeyu   

不错,不错,学习了
Andrea   

可以识别表格不?直接能导出成表格那种~
liudewensss
OP
  


Andrea 发表于 2025-1-10 21:34
可以识别表格不?直接能导出成表格那种~

不可以哦只能识别图片哈
YLSpace   

感谢分享
zyanyan   

谢谢分享~
mrruby10   

学习学习
您需要登录后才可以回帖 登录 | 立即注册

返回顶部