首页 > 其他分享 >结合光学字符识别模型的GUI工具

结合光学字符识别模型的GUI工具

时间:2024-07-30 10:54:32浏览次数:14  
标签:字符识别 img self result path model 识别 GUI 光学

前言:先附上源码,项目太大(包含跑模型的训练文件)github上面放不下所以只能存网盘里。
链接: https://pan.baidu.com/s/1bzu8psAHkLQzibvj0jzXXw 提取码: 6xx6

1 系统功能描述

1.1 对图片和截图进行OCR识别

对图片和截图进行OCR(Optical Character Recognition,光学字符识别)识别功能是一种将图片或截图中的文本内容转换为可编辑、可搜索的数字化文本的技术。它允许用户导入图片,通过先进的OCR算法识别出图片中的文本,并将识别结果以可编辑的文本格式输出。
OCR识别功能无需用户手动输入,能够自动分析图片中的字符,并转化为机器可读的文本数据。这极大地提高了处理图片中文本信息的效率,使得从图片中提取文本内容变得更加简单快捷。

1.2 对图片和PDF文件中的表格进行识别

该功能通过先进的图像处理和机器学习算法,对输入的图片或PDF文件进行智能分析。它能够识别表格的边界、单元格、行和列等关键元素,并提取其中的文本内容。在识别过程中,该功能会考虑表格的排版、字体、大小等因素,以确保识别的准确性和完整性。
一旦表格被成功识别,用户可以将提取的数据导出为常见的文件格式,如同CSV、Excel等,以便进行后续的分析和处理。这些文件格式具有强大的数据处理能力,用户可以轻松地对表格数据进行排序、筛选、计算等操作,满足各种数据分析和报告求。

1.3 对身份证和发票进行信息抽取

身份证信息提取允许用户上传身份证图片,系统能够自动识别并提取身份证上的关键信息,如姓名、性别、民族、地址和身份证号码等。通过图像处理和OCR技术,系统能够精确地定位并识别身份证上的文本内容,确保数据的准确性和完整性。提取后的信息会以结构化或可编辑的格式展示给用户,方便用户进一步处理和使用。
发票信息提取功能适用于用户上传的发票图片或扫描件。系统能够自动检测和识别发票上的关键信息,包括发票代码、发票号码、开票日期、购买方信息、销售方信息、商品清单以及金额等。利用图像识别和深度学习技术,系统能够准确提取并整理这些信息,以结构化的形式呈现给用户。同时,系统还可以对发票的有效性进行验证,确保所处理发票的真实性和合规性。提取后的发票信息可用于报销、统计等后续操作,提高了工作效率和准确性。

1.4 对验证码进行识别

该功能的核心在于利用OCR技术,对验证码图像进行预处理、特征提取和文本识别等步骤。首先,系统会对输入的验证码图像进行必要的预处理,如去噪、二值化、倾斜校正等,以提高识别的准确性。接着,系统会利用深度学习等算法,对图像中的字符进行特征提取和分类,识别出每个字符的具体内容。最后,系统会将识别出的字符按照一定规则进行组合,形成完整的验证码文本信息,并返回给用户或应用程序。

2 系统功能实现

2.1 对图片和截图进行OCR识别

在python文件中定义一个函数对图片进行识别,功能包括打开一个子窗口、截图、处理截图、在GUI中显示截图以及使用OCR(Optical Character Recognition,光学字符识别)技术识别截图中的文本。
代码展示如下:

    def go2(self):
        '''
        截图
        :return:
        '''
        self.open_son_window()
        self.ow.withdraw()  # 先暂时隐藏子窗口

        file_path = "test.png"
        ScreenShot(None, file_name=file_path)
        print(file_path)
        # 使用PIL中的ImageTk来展示图片
        width, height = scale(file_path, 600)
        img_new = Image.open(file_path).resize((width, height))
        self.photo = ImageTk.PhotoImage(img_new)
        ttk.Label(self.ow_frame, image=self.photo).grid(row=0, column=0)
        # 调用OCR对图片进行识别
        result = my_ocr(file_path)

        # 首先删除box中之前的识别结果
        self.box.delete('1.0', 'end')
        # 设置box尺寸
        self.box.configure(width=30, height=20)
        self.box.insert(INSERT, result)
        self.ow.deiconify()  # 显示子窗口

2.2 对PDF文件和表格进行识别

定义一个名为go3的方法,这个方法的主要功能是进行截图并调用一个名为my_table的函数来识别截图中的表格。

代码展示如下:
    def go3(self):
        '''
        表格
        :return:
        '''
        file_path = "test_table.png"
        ScreenShot(self.root, file_name=file_path)
        print(file_path)
        # 调用my_table对图片进行识别
        my_table(file_path)



def go7(self):
        '''
        pdf识别
        '''

        path = filedialog.askopenfilename(filetypes=[('PDF', "*.pdf")])
        imgs = pdf_to_images(path)

        # 创建一个进度条,设置其最大值为100          font=("微软雅黑", 18, 'bold'),
        #             mask='loading...{}%',            bootstyle=INFO,
        #             mode=DETERMINATE,
        progress = ttk.Floodgauge(self.root, bootstyle=INFO, mode=DETERMINATE, length=300, mask='正在识别第{}页中',
                                  font=("微软雅黑", 18, 'bold'), maximum=len(imgs))
        progress.grid(pady=20)
        self.root.update()
        progress['value'] = 1

        self.root.update_idletasks()  # 更新空闲任务
        with open('pdf.txt', 'w', encoding='utf-8') as f:
            for img in imgs:
                f.write(f'pdf第{progress["value"]}页\n' + my_ocr(img))
                progress['value'] += 1
                self.root.update_idletasks()  # 更新进度条显示
        progress.destroy()
        self.root.update()
        os.startfile('pdf.txt')

2.3 对身份证和发票进行信息抽取

定义一个对身份证信息进行提取的函数,该函数包括以下功能:打开子窗口,隐藏子窗口,选择图片文件,展示图片,身份证识别,信息提取,输出结果。
代码展示如下:

    def go5(self):   #身份证识别
        self.open_son_window()
        self.ow.withdraw()  # 先暂时隐藏子窗口
        # 点击按钮选择一张图片,将图片展示出来
        # 选择文件,返回的是文件路径   只要图片,不要别的文件 filetypes指定文件类型
        file_path = filedialog.askopenfilename(filetypes=[('图片', "*.png"), ('图片', "*.jpg")])
        print(file_path)
        # 使用PIL中的ImageTk来展示图片
        width, height = scale(file_path, 600, 600)
        img_new = Image.open(file_path).resize((width, height))
        self.photo = ImageTk.PhotoImage(img_new)
        ttk.Label(self.ow, image=self.photo).grid(row=0, column=0)
        # 调用OCR对图片进行识别
        result = my_ocr(file_path)
        print(result)
        # 使用正则表达式提取所需信息
        name_match = re.search(r"姓名(\S+)", result)
        address_match = re.search(r"住址([\s\S]+?)\n公民", result)
        id_match = re.search(r"公民身份号码\n(\d+)", result)

        # 获取匹配结果
        name = name_match.group(1) if name_match else ''
        address = address_match.group(1).replace('\n', '') if address_match else ''
        id_number = id_match.group(1) if id_match else ''
        r = f'姓名:{name}\n住址:{address}\n公民身份号码:{id_number}\n'



def go6(self):
        '''
        发票
        :return:
        '''
        self.open_son_window()
        self.ow.withdraw()  # 先暂时隐藏子窗口
        # 点击按钮选择一张图片,将图片展示出来
        # 选择文件,返回的是文件路径   只要图片,不要别的文件 filetypes指定文件类型
        path = filedialog.askopenfilename(filetypes=[('图片', "*.png"), ('图片', "*.jpg")])
        img_path = 'result.jpg'

        progress = ttk.Floodgauge(self.root, bootstyle=SUCCESS, mode=DETERMINATE, length=300, mask='正在识别中',
                                  font=("微软雅黑", 18, 'bold'), maximum=100)
        progress.grid(pady=20)
        self.root.update()

        try:
            result = ocr_predict(path)
        except Exception as e:
            messagebox.showinfo('', str(e))
            progress.destroy()
            return

        # 使用PIL中的ImageTk来展示图片
        width, height = scale(img_path, 500, 600)
        img_new = Image.open(img_path).resize((width, height))
        self.photo = ImageTk.PhotoImage(img_new)
        ttk.Label(self.ow, image=self.photo).grid(row=0, column=0)

        # 首先删除box中之前的识别结果
        self.box.delete('1.0', 'end')
        # 设置box尺寸

        ft = tkinter.font.Font(family='微软雅黑', size=18)  ###有很多参数
        self.box.configure(width=30, height=20, foreground='blue', font=ft)

        self.box.insert(INSERT, result)
        self.ow.deiconify()
        progress.destroy()

2.4 对验证码进行识别

定义一个函数用于打开一个新的Tkinter子窗口,隐藏主窗口,让用户选择一张图片,展示该图片,并使用OCR技术来识别图片中的验证码,然后将识别的结果展示在一个文本框中。
代码展示如下:

def go4(self):
       '''
       验证码
       :return:
       '''
       self.open_son_window()
       self.ow.withdraw()  # 先暂时隐藏子窗口
       # 点击按钮选择一张图片,将图片展示出来
       # 选择文件,返回的是文件路径   只要图片,不要别的文件 filetypes指定文件类型
       file_path = filedialog.askopenfilename(filetypes=[('图片', "*.png")])
       print(file_path)
       # 使用PIL中的ImageTk来展示图片
       width, height = scale(file_path, 600)
       img_new = Image.open(file_path).resize((width, height))
       self.photo = ImageTk.PhotoImage(img_new)
       ttk.Label(self.ow, image=self.photo).grid(row=0, column=0)
       # 调用OCR对图片进行识别
       try:
           result = my_cptcha(file_path)
       except:
           result = ''
           messagebox.showinfo('', '图片无法识别')
       # 首先删除box中之前的识别结果
       self.box.delete('1.0', 'end')

       ft = tkinter.font.Font(family='微软雅黑', size=18)  ###有很多参数
       self.box.configure(width=30, height=20, foreground='green', font=ft)

       self.box.insert(INSERT, result)
       self.ow.deiconify()

3 系统完成效果

3.1 对图片和截图进行OCR识别结果展示

选择:
在这里插入图片描述

在这里插入图片描述

截图:

在这里插入图片描述
在这里插入图片描述

3.2 对PDF文件和表格进行识别结果展示

pdf识别:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

表格:
在这里插入图片描述
识别表格后生成的结果:
在这里插入图片描述

3.3 对身份证和发票进行信息抽取结果展示

身份证识别:

不做展示

发票:
(本图展示的为互联网中已公开的图片)
在这里插入图片描述

3.4 对验证码进行识别结果展示

在这里插入图片描述
在这里插入图片描述

4.本项目中主要使用的模型封装配置

def my_table(img_path):
	'''
	表格的识别模型
	'''
    # 实例化,指定模型的存放路径
    pp = PPStructure(show_log=True, use_gpu=True, det_model_dir="model/model_table/det/",
                     rec_model_dir="model/model_table/rec/",
                     table_model_dir="model/model_table/table/", layout_model_dir="model/model_table/layout/")
    # img_path =  "table_test01.png"
    img = cv2.imread(img_path)
    result = pp(img)
    index = 0
    excele_path = "路径"
    for region in result:
        if region['type'].lower() == 'table' and len(region['res']) > 0 and 'html' in region['res']:
            html = region['res']['html']
            img_name = os.path.basename(img_path).split('.')[0]
            messagebox.showinfo('', '请选择存放的文件夹')
            excele_path = f"{filedialog.askdirectory()}/{img_name}_{index}.xlsx"  # 将文件保存到指定的目录下
            # 将预测的结果保存到excel文件中
            tablepyxl.document_to_xl(html, excele_path)
            index = index + 1
            print(f"生成的exccel路径:{excele_path}")
        else:
            messagebox.showinfo("", "识别失败")
            return f"识别失败"
    # img_name = os.path.basename(img_path).split('.')[0]
    # print(f"img_name:{img_name}")
    # save_structure_res(result,"./output",img_name)
    messagebox.showinfo("Success", "识别成功")
    return excele_path

def my_ocr(img_path):
	'''
	通用的识别模型
	'''
    # 实例化
    # ocr = PaddleOCR(use_gpu=False, det_model_dir="Multilingual_PP-OCRv3_det_infer/", rec_model_dir="ch_ppocr_server_v2.0_rec_infer/", cls_model_dir="model/cls/")
    ocr = PaddleOCR(use_gpu=True, det_model_dir="model/det/", rec_model_dir="model/rec/", cls_model_dir="model/cls/")
    # 调用ocr函数对图片进行识别
    result = ocr.ocr(img_path)
    # 识别出来的内容 第二列的第1项
    txts = [line[1][0] for line in result[0]]
    # 置信度  第二列的第二项

    return "\n".join(txts)

def my_cptcha(img_path):
	'''
	验证码的识别模型
	'''
    ocr = PaddleOCR(use_angle_cls=True, lang="en", use_gpu=True, rec_image_shape="3, 48, 320",
                    rec_char_dict_path="model/en_PP-OCRv3_det_infer/new_dict.txt", rec_char_type='en',
                    rec_algorithm='SVTR_LCNet',
                    rec_model_dir='model/en_PP-OCRv3_rec/',
                    det_model_dir='model/en_PP-OCRv3_det_infer/')  # need to run only once to download and load model into memory

    # img_path = './test/W30J.png'
    result = ocr.ocr(img_path, cls=True)

    from PIL import Image
    result = result[0]
    image = Image.open(img_path).convert('RGB')
    boxes = [line[0] for line in result]
    txts = [line[1][0] for line in result]
    scores = [line[1][1] for line in result]
    im_show = draw_ocr(image, boxes, txts, scores, font_path='ppocr_img/fonts/simfang.ttf')
    im_show = Image.fromarray(im_show)
    im_show.save('result.jpg')
    print('识别准确率:', scores)
    return '识别结果为:' + str(txts[0]) + '\n识别准确率:' + str(scores[0])

标签:字符识别,img,self,result,path,model,识别,GUI,光学
From: https://blog.csdn.net/qq_57232995/article/details/140302499

相关文章

  • 可以在没有 SAPGui 脚本记录器的情况下捕获 SAP GUI 交互吗?
    是否可以在不依赖VBS记录器的情况下捕获与SAPGUI元素的交互,是否有专门为此特定目的而设计的集成SAPGUI组件?观察:不是记录器屏幕importwin32com.client#ConectandoaoSAPGUISAPGuiAuto=win32com.client.GetObject("SAPGUI")ifnottype(SAPGuiAuto)==win3......
  • 在 GUI 按钮构造函数中使用 lambda 函数作为命令选项
    我的问题是关于在用于为下面这个Python计算器创建GUI按钮的语法中使用lambda函数。问题:我对如何编写lambda函数的理解如下1)中所示,那么它怎么可能按照2)中GUI按钮构造函数的命令选项中编写的方式编写它?计算器的完整代码如下。此Python计算器教程的视频......
  • STM32第二十三课:GUI-Guider安装使用及项目移植(7.11版本)
    目录目标一、GUI-Guider获取与安装1.GUI-Guider获取2.安装二、使用步骤1.创建一个新项目2.快速使用三、项目移植注意事项目标1.安装GUI-guider。2.学会使用GUI-guider设计界面。3.学会将GUI-guider设计后的界面移植到项目工程中。一、GUI-Guider获取与安装 ......
  • 我无法使用 PySimpleGUI 打开第三个窗口
    我无法创建第三个窗口。代码工作没有错误,但它不显示代码结束的窗口当前我正在尝试使其显示一个复选框表,供人们选择座位。我测试过它是否根本没有运行。把print放在它后面,它就会打印出来。我也尝试让它显示简单的文本,但这也不起作用。下面是代码:layout3=[[sg.Text('Tes......
  • imgui中文字体库导入乱码问题
    1.中文字体库导入乱码问题1.修改clion中的文件编码配置2.按住Ctrl+Shift+Alt+/,选中Registry…,然后取消run.processes.with.pty3.cmakelist.txt导入字体文件,注意不要加u8了,不然会乱码#字体文件include_directories(${PROJECT_SOURCE_DIR}/include/fonts)然后mai......
  • 【nacos】记一次使用NacosExploitGUI扫描发现nacos安全漏洞
    一、场景   公司使用nacos作为配置和注册中心,使用的版本是1.4.0 二、下载NacosExploitGUIhttps://github.com/charonlight/NacosExploitGUI下载release中的压缩包  三、运行NacosExploitGUI1、运行$java-jarNacosExploitGUI_v4.0.jarError:JavaFXruntime......
  • Chrome 浏览器更新后,我的 python tagui 代码工作不稳定。问题的解决方法是什么
    我编写了一个pythontagui脚本来在chrome中操作Intranet网页。它运行良好。但是在chrome浏览器更新后,脚本每次都会在某个时刻随机停止,并且也不会抛出错误。请帮忙。我尝试重新启动电脑,但这并没有解决问题。Chrome浏览器更新后,TagUI脚本工作不稳定的问题可能由以......
  • 如何在 CustomTkinter GUI 中实现放大/缩小功能
    我正在尝试向RaspberryPi上的customtkinterGUI添加放大/缩小功能。由于customtkinter中缺乏对缩放小部件的内置支持,我正在努力实现这一目标。有没有人在customtkinter应用程序中成功实现了缩放功能,您能否提供有关如何根据用户输入动态调整小部件大小和重新定位小部件的指......
  • Unity UGUI 之 事件接口
    本文仅作学习笔记与交流,不作任何商业用途本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正本文在发布时间选用unity 2022.3.8稳定版本,请注意分别1.什么是事件接口?首先,什么是事件?C#事件-CSDN博客什么是接口?TYNAM测试博客(cnblogs.com)再......
  • PySimpleGUI总结
    这篇文章主要是对GUI整体来说的,以下将讲述GUI的下载,内容与具体流程。其他详细内容和使用下次具体讲述。下载首先,打开你的pycharm,找到你的终端长这样然后在命令行输入pipinstallPySimpleGUI但是!!!pysimplegui这个东西5.0版本之后不是免费的,只有免费试用30天。因此如果......