python EasyOCR库如何使用
发表于:2025-01-29 作者:千家信息网编辑
千家信息网最后更新 2025年01月29日,本篇内容介绍了"python EasyOCR库如何使用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
千家信息网最后更新 2025年01月29日python EasyOCR库如何使用
本篇内容介绍了"python EasyOCR库如何使用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
说明
1、EasyOCR是一个用python编写的OCR三方库。可以在python中调用,用来识别图像中的文字,并输出为文本。
2、支持80多种语言的识别,识别精度高,甚至要超过PaddleOCR。
安装命令
pip install easyocr
代码实现
import easyocr #设置识别中英文两种语言reader = easyocr.Reader(["ch_sim","en"], gpu = False) # need to run only once to load model into memoryresult = reader.readtext(r"d:Desktop4A34A16F-6B12-4ffc-88C6-FC86E4DF6912.png", detail = 0)print(result)
实例扩展:
图文提取的代码
from pathlib import Pathimport easyocrfile_url = r"识别图片.jpg" # 需识别的图片split_symbol = " " # 默认空格为分隔符row_space = 15 # 默认字符高度为15px,当识别出来的字符间距超过这个数值时会换行。def make_reader(): # 将模型加载到内存中。模型文件地址 C:Users用户.EasyOCRmodel reader = easyocr.Reader(["ch_sim", "en"]) return readerdef change_to_character(file_url, reader, split_symbol=" ", row_space=15, save_dir="."): with open(file_url, "rb") as img: img_b = img.read() result = reader.readtext(img_b) result.sort(key=lambda x: x[0][0][1]) # 按竖直方向,进行排序==>进行分行处理。 # for i in result: # print(i) # print("="*100) # 按行进行分组 content = [] item = [result[0]] # 首先放入第一个元素 for i in result[1:]: if row_space >= i[0][0][1] - item[-1][0][0][1] >= 0: item.append(i) else: content.append(item) item = [i] content.append(item) filemane = Path(file_url).name.split(".")[0] with open(f"{save_dir}/{filemane}.txt", "w", encoding="utf8") as t: for i in content: # i 为每一行的内容 i.sort(key=lambda x: x[0][0][0]) # 对每行的内容进行先后排序 for r in i: # print(r) t.write(r[1] + split_symbol) t.write("") return contentif __name__ == "__main__": change_to_character(file_url, make_reader())
UI 界面的代码
import tkinter as tkfrom tkinter import filedialogfrom PIL import Image, ImageTkfrom pathlib import Pathfrom character import change_to_character, make_readerfrom threading import Threadimport time# class Showing(tk.Frame):# def __init__(self, master=None):# super().__init__(master)# self.master = master# self.pack()# # self.img = tk.PhotoImage(file=r"C:UsersyanhyDesktop捕获22.PNG")# self.create_widgets()## def create_widgets(self):# self.img = tk.PhotoImage(file=r"C:UsersyanhyDesktop捕获22.PNG")# self.img_wig = tk.Label(self, image=self.img)# self.img_wig.pack()# 最外层窗口设置root = tk.Tk()root.title("图片文字识别程序 联系:410889472@qq.com")window_x = root.winfo_screenwidth()window_y = root.winfo_screenheight()WIDTH = 1200HEIGHT = 750x = (window_x - WIDTH) / 2 # 水平居中y = (window_y - HEIGHT) / 3 # 垂直偏上root.geometry(f"{WIDTH}x{HEIGHT}+{int(x)}+{int(y)}")root.resizable(width=False, height=False)# 》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》Row_space = 15File_url_list = []Img_type = [".jpg", ".jpeg", ".png", ".gif"]Split_symbol = " " # 间隔符。Save_dir = Path.cwd().joinpath("img_to_word")if Save_dir.is_dir(): passelse: Path.mkdir(Save_dir)# 》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》def test(): print(f"{Row_space=}")def choose_file(): # 获取导入的图片路径地址 global show_img, img_label, text, File_url_list filenames = filedialog.askopenfilenames() if len(filenames) == 1 and len(File_url_list) == 0: # 单张图片导入,显示图片 if Path(filenames[0]).suffix.lower() in Img_type: # 判断是否图片类型 File_url_list = list(filenames) try: if text.winfo_exists(): text.destroy() except NameError as e: print(f"choose_file提示:张图片导入错误>>> {e}") try: if img_label.winfo_exists(): img_label.destroy() except NameError as e: print(f"choose_file提示:单张图片导入错误>>> {e}") img = Image.open(File_url_list[0]).resize((560, 660)) # print(img.size) show_img = ImageTk.PhotoImage(image=img) img_label = tk.Label(f_left, image=show_img) img_label.pack() else: print("导入的是非图像格式") else: # 多张图片导入,显示列表。 try: if img_label.winfo_exists(): img_label.destroy() except NameError as e: print(f"提示:多张图片导入错误>>> {e}") try: if text.winfo_exists(): text.destroy() except NameError as e: print(f"提示:多张图片导入错误>>> {e}") text = tk.Text(f_left, spacing1=5, spacing3=5) text.pack(fill="both", expand=True) for i in filenames: if Path(i).suffix.lower() in Img_type: File_url_list.append(i) else: pass File_url_list = set(File_url_list) for i in list(File_url_list): # 把文件写入到文本框中 text.insert("end", str(list(File_url_list).index(i)+1) + ": " + i + "") File_url_list = list(File_url_list) print(f"{File_url_list=}")def choose_dir(): global show_img, img_label, text, File_url_list directoryname = filedialog.askdirectory() print(f"{directoryname=}") try: if img_label.winfo_exists(): img_label.destroy() except NameError as e: print(f"choose_dir提示:多张图片导入错误>>> {e}") try: if text.winfo_exists(): text.destroy() except NameError as e: print(f"choose_dir提示:多张图片导入错误>>> {e}") text = tk.Text(f_left, spacing1=5, spacing3=5) text.pack(fill="both", expand=True) for i in Path(directoryname).iterdir(): # 获取文件夹下的所有文件。 if Path(i).suffix.lower() in Img_type: File_url_list.append(i.as_posix()) # as_posix() 把Path型转为字符串。 else: pass File_url_list = set(File_url_list) for i in list(File_url_list): # 把文件写入到文本框中 text.insert("end", str(list(File_url_list).index(i) + 1) + ": " + i + "") File_url_list = list(File_url_list) print(f"{File_url_list=}")def clear_file_list(): global File_url_list File_url_list.clear() try: if img_label.winfo_exists(): img_label.destroy() except NameError as e: print(f"clear_file_list提示:清空错误>>> {e}") try: if text.winfo_exists(): text.destroy() except NameError as e: print(f"clear_file_list提示:清空错误错误>>> {e}")def get_entry1(): # 设置换行间距变量值 global Row_space num = entry1.get() if num.isdigit(): if int(num) > 0: Row_space = int(num) else: entry1.delete(0, "end") entry1.insert(0, 15) Row_space = 15def set_split_symbol(): global Split_symbol Split_symbol = entry2.get() print(f"{Split_symbol=}")def do_change(): if File_url_list: v.set("文字提取中,请稍后……") button_do.config(state="disable") # 使按钮不可用。 # ======================================== def main(): reader = make_reader() for i in File_url_list: content = change_to_character(i, reader, row_space=Row_space, split_symbol=Split_symbol, save_dir=Save_dir) read_text.delete(1.0, "end") for c in content: # i 为每一行的内容 c.sort(key=lambda x: x[0][0][0]) # 对每行的内容进行先后排序 for r in c: # print(r) read_text.insert("end", r[1] + Split_symbol) read_text.insert("end", "") v.set("文字提取结束。") button_do.config(state="normal") # 恢复按钮可用。 # ======================================== t = Thread(target=main, daemon=True) t.start() else: v.set("请先选择图片!")def join_file(): v.set("文件开始合并。") filst = list(Path(Save_dir).iterdir()) # 获取文件夹中所有的文本文件。 with open(f"{Save_dir}/合并文件.txt", "w", encoding="utf8") as join_f: for f in filst: with open(f, "r", encoding="utf8") as r_f: read_con = r_f.read() join_f.write(f.name+""+read_con + "") time.sleep(1) v.set("文件合并完毕。")# 》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》f_top = tk.Frame(root, height=65, width=1100, bd=1, relief="flat") # "sunken" "raised","groove" 或 "ridge"f_top.pack_propagate(False) # 如果不加这个参数,当Frame框架中加入部件时,会自动变成底层窗口,自身的特性会消失。f_top.pack(side="top", pady=5)f_left = tk.Frame(root, height=660, width=560, bd=1, relief="groove")f_left.pack_propagate(False)f_left.pack(side="left", padx=20)f_right = tk.Frame(root, height=660, width=560, bd=1, relief="groove")f_right.pack_propagate(False)f_right.pack(side="left", padx=20)read_text = tk.Text(f_right, spacing1=5, spacing3=5)read_text.pack(fill="both", expand=True)# 》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》button_choose_file = tk.Button(f_top, text="选择图片", command=choose_file)button_choose_file.pack(side="left", padx=10, ipadx=5)button_choose_file = tk.Button(f_top, text="选择文件夹", command=choose_dir)button_choose_file.pack(side="left", padx=10, ipadx=5)button_clear_file = tk.Button(f_top, text="清空选择", bg="#FFEF2F", command=clear_file_list)button_clear_file.pack(side="left", padx=5, ipadx=5)# 》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》f_row_content = tk.Frame(f_top, height=50, width=300, bg="#D1D4D0", relief="flat") # "sunken" "raised","groove" 或 "ridge"f_row_content.pack_propagate(False)f_row_content.pack(side="left", padx=15)button_set_row_height = tk.Button(f_row_content, text="设置行间距", command=get_entry1)button_set_row_height.pack(side="left", ipadx=3, padx=3)entry1 = tk.Entry(f_row_content, font=("", 18), width=3)entry1.insert(0, 15)entry1.pack(padx=5, side="left")tk.Label(f_row_content, justify="left", text="填入像素值,设置换行间距。默认15个像素。").pack(side="left")# 》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》f_split = tk.Frame(f_top, height=50, width=215, bg="#D1D4D0", relief="flat") # "sunken" "raised","groove" 或 "ridge"f_split.pack_propagate(False)f_split.pack(side="left", padx=4)button_split = tk.Button(f_split, text="设置分隔符", command=set_split_symbol)button_split.pack(side="left", ipadx=3, padx=3)entry2 = tk.Entry(f_split, font=("", 18), width=3)entry2.insert(0, " ")entry2.pack(padx=5, side="left")tk.Label(f_split, justify="left", text="默认一个空格").pack(side="left")# 《《《《《《《《《《《《《《《《《《《《《《 提取 合并文件 》》》》》》》》》》》》》》》》》》》》》》》》》button_do = tk.Button(f_top, text="开始提取", bg="#4AB0FF", command=do_change)button_do.pack(side="left", padx=10, ipadx=2)button_join = tk.Button(f_top, text="合并文件", command=join_file)button_join.pack(side="left", padx=5, ipadx=2)v = tk.StringVar()v.set("info……")tk.Label(f_top, bg="#2EBD1D", justify="left", textvariable=v).pack(side="left")# 《《《《《《《《《《《《《《《《《《《《《《 右键菜单 》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》def copy_text(): read_text.event_generate("<>")menubar = tk.Menu(tearoff=False)# root["menu"] = menubar # 没有把这个 菜单部件 加入到 root 窗口的菜单属性中,所以它不会在root窗口的顶部显示。menubar.add_command(label="复制", command=copy_text)def show_menu(event): """用 菜单部件 的 post 方法展示菜单""" menubar.post(event.x_root, event.y_root)read_text.bind(" ", show_menu)# 》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》root.mainloop()
"python EasyOCR库如何使用"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
图片
文件
错误
提示
内容
多张
菜单
文字
文本
选择
代码
字符
文件夹
行间
部件
排序
一行
像素
先后
分隔符
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
jdbc连接数据库视频
热血江湖哪个服务器人最少
如何实现二台服务器的数据交换
2u服务器功耗
增量模型适合哪种软件开发
神通数据库的文件保存在哪
国家网络安全法实施时间为
数据库分片树
硬盘录像机网络时间服务器选哪个
分布式数据库数据打散
数据库重置无法进入服务器
超微服务器 ipmi
玉溪公安局网络安全负责人
新荣区现代化网络安全质量服务
农安质量网络技术咨询什么价格
江西省青少年网络安全与信息科
南京三六零网络技术怎么样
法拉利网络安全投资
网络安全的基本规则是什么
人脸识别参考数据库
我的世界1.10服务器
网络安全知识班会导入
软件开发者大会2021
中国电信网络安全招聘
服务器SR850 usb
司法局网络安全风险排查总结
网络技术子网掩码计算
生物识别技术和数据库
网络安全宣传周反恐宣传
泉州直播软件开发搭建