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

一、你心目中的OCR

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

是这么大:

还是这么大:

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

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

序号

预计完成时间

开发dome名字以及功能&发布文章内容

是否已写完

文章链接

2

9月11

OCR-demo,完成批量上传识别;在一个demo中可选择不同类型的OCR识别《包含手写体/印刷体/身份证/表格/整题/名片),然后调用平台能力,具体实现步骤等。

已完成

CSDN:

微信公众号:

3

10月27

语音识别demo,demo中上传—段视频,并截取视频中短语音识别-demo的一段音频进行短语音识别

CSDN:

微信公众号:

4

9月17

智能语音评测-demo

CSDN:

微信公众号:

5

9月24

作文批改-demo

CSDN:

微信公众号:

6

9月30

语音合成-demo

CSDN:

微信公众号:

7

10月15

单题拍搜-demo

CSDN:

微信公众号:

8

10月20

图片翻译-demo

CSDN:

微信公众号:

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

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

二、成果展示

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

(一)手写体成果展示

(一)印刷体成果展示

(三)名片识别成果展示

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

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

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

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

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

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

三、前期准备

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

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

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

这次的demo使用python3开发,包括maindow.py,ocrprocesser.py,ocrtools.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("<>",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。

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

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

快来我粉丝群:每天欢快的玩耍

本文分享 CSDN - TrueDei。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

python做身份证识别_不到100行代码搞定Python做OCR识别身份证,文字等各种字体相关推荐

  1. 100行代码搞定实时视频人脸表情识别(附代码)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|OpenCV学堂 好就没有写点OpenCV4 + Open ...

  2. python加密敏感信息_仅需10行代码,使用python加密用户敏感数据

    原标题:仅需10行代码,使用python加密用户敏感数据 数据分析师必须要遵守的一个规则就是数据保密,但在跨部门沟通的时候,难免会有数据泄露的情况,所以,对于用户的姓名.手机号.地址等敏感信息,一般需 ...

  3. 100行代码搞定抖音短视频App,终于可以和美女合唱了。

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由视频咖 发表于云+社区专栏 本文作者,shengcui,腾讯云高级开发工程师,负责移动客户端开发 最近抖音最近又带了一波合唱的节奏,老 ...

  4. python爬煎蛋妹子图--20多行代码搞定煎蛋妹子图库

    如果说一个人够无聊的话... 就会做一些十分美(wei)丽(suo)的事情啦哈哈哈... 好的,话不多说,进入正题. 正如标题所示,我们今天的目标很简单: 代码要少,妹子要好. 步骤如下: 1. 首先 ...

  5. 用python编写图片生成器_不到100行代码 Python制作一个九宫格图片生成器,炫酷朋友圈!...

    朋友圈下面的这种图片排列风格,相比大家一定会很熟悉,有关于职位招聘的 Snipaste_2020-08-02_19-48-58.png 祝贺节日的, Snipaste_2020-08-02_19-49 ...

  6. python简单代码演示效果-10分钟教你用python 30行代码搞定简单手写识别!

    欲直接下载代码文件,关注我们的公众号哦!查看历史消息即可! 手写笔记还是电子笔记好呢? 毕业季刚结束,眼瞅着2018级小萌新马上就要来了,老腊肉小编为了咱学弟学妹们的学习,绞尽脑汁准备编一套大学秘籍, ...

  7. python开发一个web项目得需要多少行代码_用Python写个迷你出门问问|10几行代码搞定...

    这是菜鸟学Python的第71篇原创文章 上一篇讲了JSON文件的用法,小伙伴们感觉好像写的很不过瘾,后台有好几个小伙伴问我能不能再写一篇,其中还有两个小伙伴给我留言,问我什么是Web Api,好今天 ...

  8. 如何用python写查询名字程序_用Python写个迷你出门问问|10几行代码搞定

    上一篇讲了JSON文件的用法,小伙伴们感觉好像写的很不过瘾,后台有好几个小伙伴问我能不能再写一篇,其中还有两个小伙伴给我留言,问我什么是Web Api,好今天我会解释一下,同时利用百度开放的API写一 ...

  9. python怎么画地球_第12天|16天搞定Python数据分析,在地球上画个圈

    在数据可视化过程中,有时候,你需要将数据根据其采集的地理位置在地图上显示出来.比如说我们会想要在地图上画出城市,飞机的航线,乃至于城市景点等等.通常来说,一个地理信息系统都会带有这样的功能. 在Pyt ...

最新文章

  1. 12.27评论5位同学试验三
  2. APUE-文件和目录(八)文件时间
  3. 贡献思想 + 数论 + 思维(例题 Problem J. Prime Game)
  4. 点点客李新 | 移动社交电商行业案例干货分享
  5. outlook里面邮件不能显示图片
  6. 一文读懂区块链以及一个区块链的实现
  7. Oracle Text简介
  8. 解决windows 2003打了系统补丁后远程桌面不能用
  9. 开源库、jar包(要不要重新制造轮子)—— C/C++、Java、Python
  10. 爬虫---如何抓取app的思路和方案
  11. 工业级ERPS环网协议交换机千兆4光8电工业级冗余环网以太网交换机工业光纤环网交换机
  12. 重编译 microsip 和 pjsip 支持 mp3 录音
  13. 数字图像处理期末复习总结
  14. 三维模型格式转换神器-assimp
  15. C语言程序员个人简历范文,程序员求职放大招!牛人用C语言写简历
  16. 全国计算机三级答案,全国计算机三级数据库技术笔试试题(附正确答案)
  17. 计算广告小窥[下]要啥自行车!
  18. 微信功能升级:低调开卖全球上网卡 得罪群主进不了群
  19. Linux驱动——驱动模块初次加载成功,后面失败 failed with error -38
  20. getservbyname()函数与getservbyport()函数

热门文章

  1. 程序计数器没有OOM
  2. 软件分享系列之【PS2020下载安装】并持续分享中...
  3. Realtek 8125驱动分析第二篇——触发硬件中断
  4. QuartusII 13.0.1添加cpld库方法
  5. 误删除的照片从哪里可以找回来,误删除的照片如何恢复。
  6. 微信小程序如何访问服务器上的数据?
  7. 微信小程序之excel上传bug
  8. 出现 尝试连接“EAI_NONAME未提供,或不知道节点名或服务名”失败 解决办法
  9. Stave插件,让Fiddler能将URL映射到本地目录,实现批量文件自动响应
  10. ros navigation 中的amcl编译和运行