结合光学字符识别模型的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])
  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值