前言:先附上源码,项目太大(包含跑模型的训练文件)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