不到100行代码搞定Python做OCR识别身份证,文字等各种字体

大数据
大数据
TrueDei

不告诉你我用了它配合Python简简单单开发OCR识别,带你识别手写体、印刷体、身份证等N种,附代码!

一、你心目中的OCR

在你心目中,OCR是多大(…, 厉害,好厉害,非常厉害,…)呢?

是这么大:

在这里插入图片描述

还是这么大:

在这里插入图片描述

反正在我心中就和马云爸爸一样这么大。

不管多大了,一块来履行我之前的承诺连更一个月之内,把几篇写完。

序号预计完成时间开发dome名字以及功能&发布文章内容是否已写完文章链接
19月3文本翻译,单文本翻译,批量翻译demo。已完成CSDN:https://blog.csdn.net/qq_17623363/article/details/108511541
微信公众号:https://mp.weixin.qq.com/s/6AMzkTtPKf4JcATHD-_yAg
29月11OCR-demo,完成批量上传识别;在一个demo中可选择不同类型的OCR识别《包含手写体/印刷体/身份证/表格/整题/名片),然后调用平台能力,具体实现步骤等。已完成CSDN:
微信公众号:
310月27语音识别demo,demo中上传—段视频,并截取视频中短语音识别-demo的一段音频进行短语音识别CSDN:
微信公众号:
49月17智能语音评测-demoCSDN:
微信公众号:
59月24作文批改-demoCSDN:
微信公众号:
69月30语音合成-demoCSDN:
微信公众号:
710月15单题拍搜-demoCSDN:
微信公众号:
810月20图片翻译-demoCSDN:
微信公众号:

关注我微信公众号第一时间推送给你哦:

回复菜单,更有好礼,惊喜在等着你。

在这里插入图片描述

二、成果展示

最近工作中涉及到一部分文档和纸质文档的校验工作,就想把纸质文件拍下来,用文字来互相校验。想到之前调用有道智云接口做了文档翻译。看了下OCR文字识别的API接口,有道提供了多种OCR识别的不同接口,有手写体、印刷体、表格、整题识别、购物小票识别、身份证、名片等。干脆这次就继续用有道智云接口做个小demo,把这些功能都试了试,当练手,也当为以后的可能用到的功能做准备了。

在这里插入图片描述

(一)手写体成果展示

在这里插入图片描述

(一)印刷体成果展示

在这里插入图片描述

(三)名片识别成果展示

这里我找来了一个名片模板,看起来准度还是可以的

在这里插入图片描述

(四)身份证(同样是模板)成果展示

在这里插入图片描述

(五)表格识别成果展示:

(这超长的json, >_< emmm…)

在这里插入图片描述

(六)整题识别成果展示:

(公式识别也有做,识别结果json比较长,看起来没那么直观,就不在这里贴了)。

在这里插入图片描述

三、前期准备

首先,是需要在有道智云的个人页面上创建实例、创建应用、绑定应用和实例,获取到应用的id和密钥。具体个人注册的过程和应用创建过程详见上面列表中的第一篇文章哦。

在这里插入图片描述

在这里插入图片描述

四、开发过程手把手,手拉手教给你

下面介绍具体的代码开发过程:

这次的demo使用python3开发,包括maindow.pyocrprocesser.pyocrtools.py三个文件。

界面部分,为了简化开发过程,使用python自带的tkinter库,提供选择待识别文件识别类型展示识别结果的功能ocrprocesser.py根据所选类型调用相应api接口,完成识别过程并返回结果;ocrtools.py封装了经整理后的有道ocr 的各类api,实现了分类调用。

(一)开发界面

界面部分代码如下,使用了tkinter的grid来排列元素

root=tk.Tk()
root.title("netease youdao ocr test")
frm = tk.Frame(root)
frm.grid(padx='50', pady='50')

btn_get_file = tk.Button(frm, text='选择待识别图片', command=get_files)
btn_get_file.grid(row=0, column=0,  padx='10', pady='20')
text1 = tk.Text(frm, width='40', height='5')
text1.grid(row=0, column=1)

combox=ttk.Combobox(frm,textvariable=tk.StringVar(),width=38)
combox["value"]=img_type_dict
combox.current(0)
combox.bind("<<ComboboxSelected>>",get_img_type)
combox.grid(row=1,column=1)

label=tk.Label(frm,text="识别结果:")
label.grid(row=2,column=0)
text_result=tk.Text(frm,width='40',height='10')
text_result.grid(row=2,column=1)

btn_sure=tk.Button(frm,text="开始识别",command=ocr_files)
btn_sure.grid(row=3,column=1)
btn_clean=tk.Button(frm,text="清空",command=clean_text)
btn_clean.grid(row=3,column=2)

root.mainloop()

(二)ocr_files方法

其中btn_sure绑定事件ocr_files()文件路径识别类型传入ocrprocesser:

def ocr_files():
    if ocr_model.img_paths:
        ocr_result=ocr_model.ocr_files()
        text_result.insert(tk.END,ocr_result)
    else :
        tk.messagebox.showinfo("提示","无文件")

ocrprocesser中主要方法为ocr_files(),将图片base64处理后调用封装的api。

def ocr_files(self):
    for img_path in self.img_paths:
        img_file_name=os.path.basename(img_path).split('.')[0]
        #print('==========='+img_file_name+'===========')
        f=open(img_path,'rb')
        img_code=base64.b64encode(f.read()).decode('utf-8')
        f.close()
        print(img_code)
        ocr_result= self.ocr_by_netease(img_code, self.img_type)
        print(ocr_result)
        return ocr_result

(二)get_ocr_result方法

经本人通读整理有道api的文档,大致分为以下四个api入口:手写体/印刷体识别身份证/名片识别表格识别整题识别,每个接口的url不同,请求参数也不全一致,因此demo中首先根据识别类型加以区分:

# 0-hand write
# 1-print
# 2-ID card
# 3-name card
# 4-table
# 5-problem
def get_ocr_result(img_code,img_type):
    if img_type==0 or img_type==1:
        return ocr_common(img_code)
    elif img_type==2 or img_type==3 :
        return ocr_card(img_code,img_type)
    elif img_type==4:
        return ocr_table(img_code)
    elif img_type==5:
        return ocr_problem(img_code)
    else:
        return "error:undefined type!"

(三)识别普通文字的功能开发

而后根据接口所需的参数组织data等字段,并针对不同接口的返回值进行简单解析和处理,并返回:

def ocr_common(img_code):
    YOUDAO_URL='https://openapi.youdao.com/ocrapi'
    data = {}
    data['detectType'] = '10012'
    data['imageType'] = '1'
    data['langType'] = 'auto'
    data['img'] =img_code
    data['docType'] = 'json'
    data=get_sign_and_salt(data,img_code)
    response=do_request(YOUDAO_URL,data)['regions']
    result=[]
    for r in response:
        for line in r['lines']:
            result.append(line['text'])
    return result

(四)识别纸等的功能开发

def ocr_card(img_code,img_type):
    YOUDAO_URL='https://openapi.youdao.com/ocr_structure'
    data={}
    if img_type==2:
        data['structureType'] = 'idcard'
    elif img_type==3:
        data['structureType'] = 'namecard'
    data['q'] = img_code
    data['docType'] = 'json'
    data=get_sign_and_salt(data,img_code)
    return do_request(YOUDAO_URL,data)

(五)识别表格的功能开发

def ocr_table(img_code):
    YOUDAO_URL='https://openapi.youdao.com/ocr_table'
    data = {}
    data['type'] = '1'
    data['q'] = img_code
    data['docType'] = 'json'
    data=get_sign_and_salt(data,img_code)
    return do_request(YOUDAO_URL,data)

(六)识别题的功能开发

def ocr_problem(img_code):
    YOUDAO_URL='https://openapi.youdao.com/ocr_formula'
    data = {}
    data['detectType'] = '10011'
    data['imageType'] = '1'
    data['img'] = img_code
    data['docType'] = 'json'
    data=get_sign_and_salt(data,img_code)
    response=do_request(YOUDAO_URL,data)['regions']
    result = []
    for r in response:
        for line in r['lines']:
            for l in line:
                result.append(l['text'])
    return result

(七)get_sign_and_salt方法签名信息等

get_sign_and_salt()为data加入了必要的签名等信息:

def get_sign_and_salt(data,img_code):
    data['signType'] = 'v3'
    curtime = str(int(time.time()))
    data['curtime'] = curtime
    salt = str(uuid.uuid1())
    signStr = APP_KEY + truncate(img_code) + salt + curtime + APP_SECRET
    sign = encrypt(signStr)
    data['appKey'] = APP_KEY
    data['salt'] = salt
    data['sign'] = sign
    return data

五、总结

总的而言,功能还是很强大的,各种都支持。就是视觉算法工程师没有做分类功能,需要自己分别对每一类的图像进行分接口调用,而且接口完全不可混用,比如在开发过程中我将名片图片当作身份证提交给api,结果返回了“Items not found!”,对于调用api的开发者来讲有点麻烦,当然这样也在一定程度上提高了识别准确率,而且个人猜测应该也是为了方便分接口计费 : P。

项目地址:https://github.com/LemonQH/WordPicsOCRDemo

关注我微信公众号第一时间推送给你哦:

回复菜单,更有好礼,惊喜在等着你。

在这里插入图片描述

快来我粉丝群:每天欢快的玩耍
在这里插入图片描述

TrueDei CSDN认证博客专家 Linux 分布式 Java
不荒废现在,不畏惧未来!我认为把知识给别人讲会,讲明白,自己才彻底明白。努力把文章写好,写明白每一篇文章,分享给更多人。
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师:上身试试 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值