精华内容
下载资源
问答
  • EasyOCR 即用型OCR,具有80多种以及所有流行的书写脚本,包括拉丁文,中文,阿拉伯文,梵文,西里尔文等。 什么是新的 2021年4月20日-版本1.3.1 添加对PIL图像的支持(感谢 ) 添加塔吉克语(tjk) 更新命令行的...
  • easyocr模块.rar

    2021-06-17 14:30:53
    在user/.EasyOCR/model中解压即可使用
  • 简单解决easyocr识别文字结果上下窜行问题,详细解释请看我的csdn博客
  • EasyOCR 支持80多种语言的即用型OCR,包括中文,日文,韩文和泰文。 什么是新的 2021年2月1日-版本1.2.3 将setLanguageList方法添加到Reader类。 这是在创建类实例之后更改语言(在同一模型中)的便捷api。 ...
  • EasyOCR

    千次阅读 2020-12-07 07:30:00
    软硬件环境windows 10 64bitanaconda with python 3.7nvidia gtx 1066pytorch 1.6easyocr简介EasyOCR是一款用py...

    软硬件环境

    • windows 10 64bit

    • anaconda with python 3.7

    • nvidia gtx 1066

    • pytorch 1.6

    • easyocr

    简介

    EasyOCR是一款用python语言编写的OCR第三方库,同时支持GPUCPU,还提供了可直接运行的命令行工具,目前已经支持超过70种语言,当然,中文也是支持的,项目地址是: https://github.com/JaidedAI/EasyOCR

    安装easyocr

    使用conda创建虚拟环境

    conda create -n demo python=3.7
    conda activate demo
    

    接下来开始安装pytorch,来到官网 https://pytorch.org/get-started/locally/,选择PyTorch Build为稳定版1.6.0、操作系统选择windowsPackage使用pipLanguage选择PythonCUDA选择10.1,这些都是需要根据自己的实际情况进行选择。可以看到,前面步骤中我们并没有单独安装CUDA,因为pytorch的安装过程中顺便把CUDA也安装好了,这点非常棒。

    easyocr
    pip install torch==1.6.0+cu101 torchvision==0.7.0+cu101 -f https://download.pytorch.org/whl/torch_stable.html
    

    如果没有GPU环境,安装命令是

    pip install torch==1.6.0+cpu torchvision==0.7.0+cpu -f https://download.pytorch.org/whl/torch_stable.html
    

    最后使用pip安装easyocr

    pip install easyocr pyyaml
    

    easyocr的使用

    easyocr安装好后,我们就可以直接使用easyocr命令了,这一点和 tesseract-ocr 非常类似

    # 还有个实用参数--detail=1,1表示详细信息;0表示就只有识别的文本信息
    easyocr.exe -l ch_sim en -f .\ocr_test.png --gpu=True
    

    easyocr

    python中使用

    import easyocr
    # 加载模型,如果是cpu环境的话,reader = easyocr.Reader(['ch_sim','en'], gpu = False)
    reader = easyocr.Reader(['ch_sim','en'])  
    result = reader.readtext('ocr_test.png')
    print(result)
    

    执行上述代码,使用测试图片

    easyocr

    可以得到下面的结果

    (demo) C:\Users\admin\Desktop\easyocr>python test.py
    [([[80, 62], [571, 62], [571, 103], [80, 103]], '个人网站: https: xugaoxiang com|', 0.07900068163871765)]
    

    在第一次使用easyocr时,需要下载相应的模型,这个动作是自动执行的,模型文件存放在目录~/.EasyOCR/model

    easyocr

    参考资料

    • https://github.com/JaidedAI/EasyOCR

    • https://xugaoxiang.com/2019/12/08/anaconda/

    展开全文
  • EasyOCR Latest update: The 5.X version will be open sourced for free before February 2021. Note: After 4.X, EasyOCR is no longer open source. I am sorry for the users who support open source, because ...
  • Drubus-OCR OCR附件(PyPDF,Keras_ocr,easyOCR,Tesseract)
  • EasyOcr的简单使用

    2021-10-13 13:26:31
    之前因为需要识别验证码是中文的接口,除了使用百度提供的免费次数,自己查找了网上的方案,发现了easyocr这个项目,于是搭建了服务器环境,安装easyocr之后,编写一个程序提供了一个识别中文验证码的接口,当时的...

    背景

    之前因为需要识别验证码是中文的接口,除了使用百度提供的免费次数,自己查找了网上的方案,发现了easyocr这个项目,于是搭建了服务器环境,安装easyocr之后,编写一个程序提供了一个识别中文验证码的接口,当时的识别效率还可以,当时的中文验证码也没有很复杂。

    这里把当时的代码记录一下,以备后用。

    代码实现

    代码如下:

    # coding=utf-8
    import base64
    import uuid
    
    from flask import Flask
    from flask import request, json
    import easyocr
    import os
    
    app = Flask(__name__)
    
    # 接口的入参是验证码图片的base64
    @app.route('/easyocr', methods=['POST'])
    def sendMessageToOa():
        try:
            data = request.get_data()
            json_data = json.loads(data.decode("UTF-8"), strict=False)
            base64_str = json_data.get("base64")
            allow = json_data.get("allow")
            image_data = base64.b64decode(base64_str)
            file_name = str(uuid.uuid1()) + ".jpg"
            file = open(file_name, "wb")
            file.write(image_data)
            file.close()
            r = easyocr.Reader(['ch_sim'],gpu = False)
            res = r.readtext(file_name, detail=0, allowlist=allow)
            os.remove(file_name)
            return '{"status":"200", "result":"' + res[0] + '"}'
        except Exception as e:
            print(e)
            return '{"status":"500"}'
    
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=8181)
    
    

    按照官方github仓库进行安装应该没啥大问题,只不过记得当时的那个模型下载了很久。

    我部署的是在远程服务器上面,使用root进行安装的,所以模型的位置是在:

    /root/.EasyOCR/model
    

    具体的模型名称如下:
    在这里插入图片描述
    我应该把这两个模型保存起来,下次直接放到对应的位置应该就不用下载这么久了。

    我真机智!


    20211013

    展开全文
  • EasyOCR安装与简要效果测试

    万次阅读 2020-07-30 17:55:33
    EasyOCR是一个用python编写的OCR三方库。git地址为:https://github.com/JaidedAI/EasyOCR。 由于笔者从事的是java开发,对python并不熟悉,所以实际上是从python开发环境安装开始的。 类似于jdk,python开发也...

    EasyOCR是一个用python编写的OCR三方库。git地址为:https://github.com/JaidedAI/EasyOCR

    由于笔者从事的是java开发,对python并不熟悉,所以实际上是从python开发环境安装开始的,如果读者对python比较熟悉,可以直接右上角。

    类似于JDK,python开发也依赖于python环境,而因为python各版本之间差异很大,很多时候不同组件依赖的是不同的python版本,甚至小版本之间也存在兼容性问题,所以网上推荐使用的是Anaconda环境管理软件。Anaconda可以隔离出多个python环境,比如可以创建一个python3.6的环境同时再创建一个python3.7的环境,而在使用时进行选择。

    安装地址:https://www.anaconda.com/products/individual

    由于我们是在64位window 7下进行安装,我们选用64-Bit Graphical Installer (466 MB)。安装完成后,打开Anaconda Navigater。

    默认的root环境里有1000多个类库,我们大多用不到,如果项目使用的是这个环境,那么用PyCharm打开的时候会加载很久。所以我们还是新建一个环境,命名为easyocr,使用pyhton3.7。

    Note 1: for Windows, please install torch and torchvision first by following the official instruction here https://pytorch.org. On pytorch website, be sure to select the right CUDA version you have. If you intend to run on CPU mode only, select CUDA = None.

    在EasyOCR官网的git上我们可以看到上述说明,因为我们是windows环境,我们需要首先安装torch

    笔者一开始是用pip安装的,但是总是安装失败,后来发现可以用这个搜索找到,勾选后安装,由于资源较大,又受到墙的限制,下载时间很长(大概一个多小时),需要耐心等待

    安装完以后,点击绿色三角,选择Open Terminal打开命令行,该命令行即使用的是easyocr这个python环境

    pip install easyocr

    然后我们根据git的说明安装easyocr

    虽然用记事本也能写python,但是习惯java后,python的语法实在是难以接受,所以一个好的IDE可以避免诸如少一个空格导致程序无法运行的麻烦,这边还是推荐使用JetBrain的PyCharm,就是IDEA的Python版。

    就像配置JDK一样,python需要配置解释程序(Interperter)。

    像上图一样配置好路径,点击ok。

    这样我们就能在已有的解释程序中选择了。

    import easyocr
    reader = easyocr.Reader(['ch_sim', 'en'])
    result = reader.readtext('d:/test2.png')
    print(result)

    代码非常简单,我们一般识别中文与英文,所以是ch_sim和en。值得注意的是,等于号(=)两边要留空格,逗号(,)后面也要留空格,这对于java程序员来说有点匪夷所思,好在PyCharm有丰富的提示。

    接下去我们测试一下这个类库的效果

    笔者的硬件配置 CPU:i3 双核 ;内存 8G;独立显卡 无

    测试用图片是pdf转换为png的图片,像素为1654x2339

    结果直接死机了,可见这个类库非常吃硬件资源,相比java的Tesseract-OCR可以说是天差地别,当然python这种解释性语言性能低下可能占了很大一部分原因,据说有人测试同样的代码java性能比python高两个数量级

    我只能尝试裁切图片,减小图片的大小,这次是1255x247

    在CPU风扇呼啸2分钟以后,运行出如下结果

    [([[384.8713347040338, 53.16253799371492], [437.70896734843177, 62.502147801594866], [431.1286652959662, 94.83746200628508], [378.29103265156823, 86.49785219840513]], 'buy', 0.9799087047576904), ([[432, 54], [927, 54], [927, 94], [432, 94]], 'true love, true friendship and good health.', 0.11305739730596542), ([[52, 58], [382, 58], [382, 90], [52, 90]], '17. It is true that Ioney can', 0.03037017211318016), ([[946.9820268028815, 100.13170185094941], [1029.8601529368057, 110.95156339987997], [1023.0179731971185, 145.8682981490506], [941.1398470631945, 135.04843660012003]], 'happy.', 0.4561459720134735), ([[396.9011154884105, 100.1539042094367], [459.74278914557516, 108.58878442052084], [454.0988845115895, 142.84609579056328], [391.25721085442484, 134.41121557947915]], 'long', 0.9857617020606995), ([[615, 101], [714, 101], [714, 146], [615, 146]], 'enough', 0.9845817685127258), ([[52, 104], [398, 104], [398, 134], [52, 134]], '18. A lot ofmillionaires have', 0.23501794040203094), ([[456, 104], [616, 104], [616, 132], [456, 132]], 'lives because', 0.4965916574001312), ([[710, 104], [946, 104], [946, 137], [710, 137]], 'Ioney Iakes them', 0.24719364941120148), ([[49, 147], [1037, 147], [1037, 188], [49, 188]], 'I9. Money may bring trouble to people when they believe money means everything.', 0.011776169762015343), ([[49, 196], [1003, 196], [1003, 235], [49, 235]], '20. People need to have friends to talk with and to ask for help from time to time.', 0.008673712611198425)]

    我们根据坐标整理一下顺序

    17. It is true that Ioney can buy true love, true friendship and good health.

    18. A lot ofmillionaires have long lives because enough Ioney Iakes them happy.

    I9. Money may bring trouble to people when they believe money means everything.

    20. People need to have friends to talk with and to ask for help from time to time.

    错误的地方已经用红色标出了,整体正确率还是比较高的,只不过不知道为什么前两句拆的这么散

    然后是中文的测试

    运行结果为

    [([[44, 0], [641, 0], [641, 28], [44, 28]], '0你是不是也有过这样的经历:白天学习的数学公式和推导过程,', 0.2881079316139221), ([[654, 2], [814, 2], [814, 28], [654, 28]], '晚上出现在梦中;', 0.9775317907333374), ([[6, 32], [200, 32], [200, 58], [6, 58]], '白夭练习过英语对话,', 0.5491944551467896), ([[210, 32], [826, 32], [826, 60], [210, 60]], "梦中你就可以非常流利地和外国人交谈'通常我们会称这种现象", 0.35171982645988464), ([[778, 62], [826, 62], [826, 90], [778, 90]], '做梦', 0.9951374530792236), ([[4, 64], [250, 64], [250, 90], [4, 90]], '为^日有所思,夜有所梦"', 0.7436116337776184), ([[274, 64], [768, 64], [768, 90], [274, 90]], '最近,科学家对这种现象做了进一步研究6结果发现,', 0.6338546276092529), ([[4, 94], [390, 94], [390, 122], [4, 122]], '真的可以帮助我们学习和记忆新学的知识,', 0.9657901525497437), ([[402, 94], [648, 94], [648, 122], [402, 122]], '梦中的你的确是在学习的6', 0.47411224246025085)]

    整理后为

    0你是不是也有过这样的经历:白天学习的数学公式和推导过程,晚上出现在梦中;白夭练习过英语对话,梦中你就可以非常流利地和外国人交谈'通常我们会称这种现象为^日有所思,夜有所梦最近,科学家对这种现象做了进一步研究6结果发现,做梦真的可以帮助我们学习和记忆新学的知识,梦中的你的确是在学习的6

    文字的识别还是非常准确的,但是标点符号大部分都不对,因为官网示例的都是告示板,一般是不会有标点符号的,这方面的缺陷也可以理解

    最后我们尝试一下古文的识别

    运行结果为

    [([[67, 4], [263, 4], [263, 29], [67, 29]], '不修德礼而专权骄恣', 0.7633501887321472), ([[277, 4], [369, 4], [369, 29], [277, 29]], '危亡之祸', 0.9936830997467041), ([[384, 4], [668, 4], [668, 32], [384, 32]], '可翘足而待;愿明府一心王室,', 0.8909436464309692), ([[678, 4], [838, 4], [838, 30], [678, 30]], '勿与交通6"太守', 0.35901787877082825), ([[6, 6], [54, 6], [54, 30], [6, 30]], '之亲', 0.9937400221824646), ([[6, 32], [76, 32], [76, 58], [6, 58]], '固遣之,', 0.5406157970428467), ([[88, 32], [180, 32], [180, 58], [88, 58]], '邰不能止', 0.9094278812408447), ([[192, 32], [578, 32], [578, 58], [192, 58]], '请求自行,许之6邰遂所在迟留以观其变', 0.35050278902053833), ([[592, 32], [700, 32], [700, 58], [592, 58]], '行至扶风0,', 0.6177576780319214), ([[712, 32], [810, 32], [810, 58], [712, 58]], '而宪就国6', 0.7293225526809692), ([[5, 56], [182, 56], [182, 86], [5, 86]], '凡交通者皆坐免官,', 0.9450605511665344), ([[194, 60], [370, 60], [370, 84], [194, 84]], '汉中太守独不与焉', 0.974287748336792)]

    整理后为

    之亲不修德礼而专权骄恣危亡之祸可翘足而待;愿明府一心王室,勿与交通6"太守固遣之邰不能止请求自行,许之6邰遂所在迟留以观其变行至扶风0而宪就国6凡交通者皆坐免官,汉中太守独不与焉

    同样,文字的识别还是非常准确的,但是标点符号与特殊符号基本无法识别

    总结:

    EasyOCR对于文字(无论英文还是中文)的识别准确率很高,但是对于标点符号与特殊符号的识别准确率很低。此外,该三方库对硬件设备的要求很高,官方推荐支持CUDA的独立显卡可以提高运行效率。随着图片的增大,运行时间呈指数增长。

    展开全文
  • python easyOCR 使用案例

    千次阅读 2021-01-29 23:59:09
    import easyocr file_url = r'识别图片.jpg' # 需识别的图片 split_symbol = ' ' # 默认空格为分隔符 row_space = 15 # 默认字符高度为15px,当识别出来的字符间距超过这个数值时会换行。 def make_reader(): #...

    利用python和easyOCR做的一个 图片文字提取工具,
    先上效果图:
    在这里插入图片描述

    这是已经封装好,可直接使用的程序。

    下面是图文提取的代码

    文件命名为 character.py

    from pathlib import Path
    import easyocr
    
    
    file_url = r'识别图片.jpg'    # 需识别的图片
    split_symbol = ' '          # 默认空格为分隔符
    row_space = 15              # 默认字符高度为15px,当识别出来的字符间距超过这个数值时会换行。
    
    
    def make_reader():
        # 将模型加载到内存中。模型文件地址 C:\Users\用户\.EasyOCR\model
        reader = easyocr.Reader(['ch_sim', 'en'])
        return reader
    
    
    def 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("\n")
        return content
    
    
    if __name__ == "__main__":
        change_to_character(file_url,  make_reader())
    

    下面是 UI 界面的代码

    import tkinter as tk
    from tkinter import filedialog
    from PIL import Image, ImageTk
    from pathlib import Path
    from character import change_to_character, make_reader
    from threading import Thread
    import 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:\Users\yanhy\Desktop\捕获22.PNG")
    #         self.create_widgets()
    #
    #     def create_widgets(self):
    #         self.img = tk.PhotoImage(file=r"C:\Users\yanhy\Desktop\捕获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 = 1200
    HEIGHT = 750
    x = (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 = 15
    File_url_list = []
    Img_type = ['.jpg', '.jpeg', '.png', '.gif']
    Split_symbol = ' '                               # 间隔符。
    Save_dir = Path.cwd().joinpath('img_to_word')
    if Save_dir.is_dir():
        pass
    else:
        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 + "\n")
            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 + "\n")
        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 = 15
    
    
    def 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', "\n")
                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+'\n'+read_con + '\n\n')
        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='填入像素值,设置换行间距。\n默认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("<<Copy>>")
    
    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('<Button-3>', show_menu)
    # 》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
    
    root.mainloop()
    
    
    展开全文
  • 安装EasyOCR

    2021-01-15 09:37:13
    需要安装的包 : torch ,torchvision,easyocr torch,torchvision 对应版本表 python 包下载地址推荐 torchvision包下载地址 pip install torchvision-0.8.2+cpu-cp38-cp38-win_amd64.whl pip install torch-1.7.1-...
  • EasyOcr git地址 EasyOCR是一款用python语言编写的OCR第三方库,同时支持GPU和CPU,目前已经支持超过70种语言. 安装(CPU) 注意: easyocr 不支持32位的python(经历了数个小时的血泪教训:python3.8-32) 先下载...
  • 2021-02-21 Python Easyocr 图片文字识别

    千次阅读 2021-02-21 09:17:05
    Python Easyocr 图片文字识别 前段时间做了车牌识别相关的内容分享,参看: 车牌识别(1)-车牌数据集生成 车牌识别(2)-搭建车牌识别模型 今天给大家分享一个简单的OCR文本识别工具:easyocr。这个模块支持...
  • AI派在读学生小姐姐Beyonce Java实战项目练习群 长按识别下方二维码,按需求添加 扫码添加Beyonce小姐姐 扫码关注 进Java学习大礼包 今天给大家介绍一个超级简单且强大的OCR文本识别工具:easyocr. 这个模块支持70...
  • GitHub上 EasyOCR的实现

    2021-03-17 14:08:11
    GitHub上 EasyOCR的实现 代码出处链接: https://github.com/JaidedAI/EasyOCR. 1. 配置环境: (1) 创建环境 conda create -n lwjorc python == 3.7 环境创建失败,使用以下语句可以恢复到默认源 conda config...
  • EasyOCR文本检测 EasyOCR文本检测 1. 前言 2. EasyOCR文本检测描述 3. 代码实现 1. 前言 EasyOCR是用于从图像提取文本的python模块。 它是一种通用的OCR,可以读取自然场景文本和文档中的密集文本。 目前支持...
  • easyOCR_TEST .py

    2021-11-17 20:39:20
    python easyOCR提取微信运动排名并写入csv 更多可参考我的另外一篇文章“python easyOCR爬取微信的运动步数排名”
  • 1、介绍 之前介绍过图片文本OCR识别,文章介绍了一个Python包pytesseract...今天介绍一个用于文本识别的新的Python包:EasyOCR,这个包是基于训练好的Deep Learning模型开发的,模型包含文本检测、文本识别功能; Easy
  • easyocr开源ocr使用心得

    2021-03-04 17:42:26
    reader = easyocr.Reader(['ch_sim','en'], gpu = False) reader.readtext('chi.jpg', detail = 0) 1.在图片对应目录下shift+右键打开windows PowerShell; 2.输入jupyter notebook 在浏览器打开notebook 打不开可...
  • 关于easyocr、paddleocr、cnocr之比较

    千次阅读 2021-01-25 10:00:00
    个人测试情况如下: 测试项 easyocr paddleocr cnocr 效率 极差 好 一般 识别准确度 一般 好 极差 代码示例如下 import easyocr # 创建reader对象 reader = easyocr.Reader(['ch_sim','en'],gpu=False) # 读取图像 ...
  • easyocr+opencv识别输入式验证码 import easyocr import cv2 reader = easyocr.Reader(['ch_sim', 'en']) pan = cv2.imread(r'C:\Users\yun\Desktop\h.jpg') # img=cv2.imshow('sd',img) img = cv2.cvtColor(pan, ...
  • EasyOCR文字识别Python安装与使用

    千次阅读 2021-02-26 10:38:55
    EasyOCR是一个OCR三方库,可以方便地使用Python进行文字识别。 1 安装 在命令提示符中,使用 pip 安装 EasyOCR 稳定版本 pip install easyocr 进入GitHub地址https://github.com/JaidedAI/EasyOCR,下载目标文件 ...
  • Linux服务器上运行easyocr代码 上一篇文章介绍过如何安装easyocr 这里我们使用jupyter notebook进行编译 1.生成密钥,这里可以自己设定一个密码用于登录jupyter from notebook.auth import passwd passwd() 2.密码...
  • 需要安装 easyocr 软件包和中文支持库。 TODO:1)截屏并识别,可复制。2)支持数学公式等符号识别 CF: https://www.jaided.ai/easyocr/modelhub/ Model Directory: C:\Users\Administrator.EasyOCR\model 代码 ...
  • linux下安装torch、easyocr easyocr 是一个文字识别的第三方库但是安装步骤有点麻烦,也是花费了大半天,总结一下。 由于easyocr库的安装需要torch库的支持,所以先去安装torch库 torch库的下载链接 ...
  • 安装环境:windows10+python3.6+easyocr 一、安装easyocr pip install easyocr (注意:python3.9使用pip安装easyocr会失败,所以使用python3.6) 二、下载模型 文字检测模型(CRAFT)(必须) ...
  • Python-EasyOCR安装过程-Windows10

    千次阅读 2020-12-21 20:04:34
    安装EasyOCR在Windows10 阅读EasyOCR官网教程 查看CUDA版本号,没有掠过 Windows系统需要安装torch、torchvision 附件 解决pip超时问题 下载的语言模型放在*[~/.EasyOCR/model]:用户目录下.EasyOCR/model文件

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 460
精华内容 184
关键字:

EasyOCR