千家信息网

python EasyOCR库如何使用

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"python EasyOCR库如何使用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
千家信息网最后更新 2026年11月03日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安全错误 数据库的锁怎样保障安全 百单网互联网科技有限公司怎么样 广州大一互联网络科技有限公司 互联网科技工作委员会毛军 互联网科技的 北京互联网科技 北京互联网络科技有限公司 润盈互联网科技 科技互联网创业计划书 互联网科技公司名称 互联网科技生活的内容 银川新华互联网科技学校地址 互联网和高科技公司 北京三清互联网科技 央行互联网金融科技公司 深圳艾果互联网通讯科技 恒生互联网科技业指数调整周期 互联网科技实习生岗位 云鲸互联网络科技有限公司 互联网高科技行业有哪些企业 河南商务圈互联网科技有限公司 互联网金融科技创新 壹账通互联网科技 互联网科技博客 衡水科技产业互联网平台 互联网科技公司招聘 西藏七维空间互联网科技有限公司 金融科技与互联网金融相同和不同 宁夏科技产业互联网案例 工业互联网科技成果转化 易租星互联网科技有限公司
0