第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > python基于百度智能云实现批量身份证信息识别(附完整代码 可直接使用)

python基于百度智能云实现批量身份证信息识别(附完整代码 可直接使用)

时间:2019-04-20 11:16:22

相关推荐

python基于百度智能云实现批量身份证信息识别(附完整代码 可直接使用)

百度智能云配置

一、登录

登录百度智能云,找到卡证文字识别,点击立即使用

地址:/product/ocr_cards

二、创建应用

创建一个应用,过程不再赘述,关键是要拿到client_idclient_secret,后面要用到

三、领取免费资源

百度智能云的接口是收费的,但是那是对于数量大的情况,这种平时小打小闹的,领取一个免费的资源就够用了,如果没有实名认证是一个月200次,做了实名认证是一个月1000次,足够了

首页这边就可以领取免费的资源根据自己的需求就可以领取相应的额度,需要注意的是领取过后大概需要十多分钟额度才能到账

编码

一切准备就绪,开搞开搞

一、单张图片处理

1.、获取Access Token

根据本文第一部分记录的client_idclient_secret,获取token

官方api文档:

# encoding:utf-8import requests # client_id 为官网获取的AK, client_secret 为官网获取的SKhost = '/oauth/2.0/token?grant_type=client_credentials&client_id=【官网获取的AK】&client_secret=【官网获取的SK】'response = requests.get(host)if response:print(response.json())

上面print出来的还不直接是Access Token,得再从里面取出来,才是我们要的东西

response.json().get("access_token")

2、调用API

根据获取到的token,调用身份证文字识别的api

官方api文档:

# encoding:utf-8import requestsimport base64'''身份证识别'''request_url = "/rest/2.0/ocr/v1/idcard"# 二进制方式打开图片文件f = open('[本地文件]', 'rb')img = base64.b64encode(f.read())params = {"id_card_side":"front","image":img}access_token = '[调用鉴权接口获取的token]'request_url = request_url + "?access_token=" + access_tokenheaders = {'content-type': 'application/x-www-form-urlencoded'}response = requests.post(request_url, data=params, headers=headers)if response:print (response.json())

需要注意的是,里面的params必传参数有两个,

其中一个是"id_card_side","front"为正面,"back"为背面;

另一个为“image”或者“url”选其一,“image”为图像数据,“url则为图片的完整路径”

正常情况下,到这里其实已经拿到了这种身份证正面照片的信息,然后就可以取数据、存excel。

所以这就结束了吗?并没有,今天要处理的是一大堆图片,而且要直接生成excel,话不多说,直接开撸!

二、批量处理

为了方便使用,直接封装成了一个类,里面的代码可能会与官方的api有一点点的不一样,但是没关系,我拆开来简单说一下,然后直接在最后附上整个类的源码!着急用的老爷可以直接跳转到最后取码使用!

1、初始化token

# encoding:utf-8import requestsimport osimport base64import winregimport xlsxwriterclass ID_OCR:def __init__(self, client_id, client_secret):self.request_url = "/rest/2.0/ocr/v1/idcard"self.client_id = client_idself.client_secret = client_secretself.token = self.get_token()self.file_list = []# 获取tokendef get_token(self):hosts = '/oauth/2.0/token?grant_type=client_credentials&client_id={}&client_secret={}'.format(self.client_id, self.client_secret)res = requests.get(hosts)return res.json().get("access_token") if res else None

client_id, client_secret作为参数传递,把tokenrequest_url作为初始化的参数直接获取,这样可以极大提高代码的复用率

2、获取所有图片的路径

# 遍历所有文件及子文件下的图片def getFileList(self, dirs, ext=None):"""输入 dir:文件夹根目录输入 ext: 扩展名"""if os.path.isfile(dirs):if ext is None:self.file_list.append(dirs)else:if ext in dirs[-3:]:self.file_list.append(dirs)elif os.path.isdir(dirs):for s in os.listdir(dirs):newDir = os.path.join(dirs, s)self.getFileList(newDir, ext)

遍历路径文件夹及其子文件夹下所有的图片,将其路径记录在self.file_list里,当然了,你当然可以在文件夹里面只放一张图片

3、操作excel

# 写入exceldef white_excel(self, file_name):url = self.get_desktop() + file_name # 桌面路径与文件名相加workbook = xlsxwriter.Workbook(url) # 新建excel表,可写不使用以上函数自己写入要保存的路径worksheet = workbook.add_worksheet() # 新建sheet,也可设置为sheet的名称为"sheet1"等自定义字段headings = ['姓名', "民族", '性别', '住址', '公民身份号码'] # 设置表头数据worksheet.write_row('A1', headings) # 插入表头for i in range(2, len(self.file_list) + 2): # 遍历file_listdata = self.post_api(self.file_list[i - 2]) # 调用self.post_api获取dataworksheet.write_row("A" + str(i), data) # 写入一行workbook.close() # 将excel文件保存关闭# 获取本地桌面路径@staticmethoddef get_desktop():key = winreg.OpenKey(winreg.HKEY_CURRENT_USER,r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders')return winreg.QueryValueEx(key, "Desktop")[0]

具体的注释全写在代码里了,请观众姥爷自查,那个获取本地桌面路径的静态函数,不想用就可以不用,可以将生成excel的路径写成任何你想放的地方;其次,如果不会用python操作excel,可查看我刚入坑时的文章:/Runaway_pilot

接下来就是上面用到的self.post_api

4、调用API

# 调用apidef post_api(self, img_url):""":param img_url: 图片路径:return: 列表 ,内容为【"姓名","民族","住址","性别","公民身份号码"】"""f = open(img_url, 'rb') # 打开文件img = base64.b64encode(f.read()) # 以二进制的形式打开图片params = {"id_card_side": "front", "image": img} # 写入body参数request_url = self.request_url + "?access_token=" + self.token # 修改请求urlheaders = {'content-type': 'application/x-www-form-urlencoded'} # 写入headers参数response = requests.post(request_url, data=params, headers=headers) # 发送post请求并获取响应data = []if response:print(response.json())try:name = response.json().get("words_result").get("姓名").get("words")mz = response.json().get("words_result").get("民族").get("words")zz = response.json().get("words_result").get("住址").get("words")xb = response.json().get("words_result").get("性别").get("words")sfz = response.json().get("words_result").get("公民身份号码").get("words")data = [name, mz, xb, zz, sfz]except:passreturn data

同样的,注释写的很清楚了,自己看

以上需要的功能就全部写完了,接下来就是整合、流程控制

5、流程控制

def run(self, file_url, filename="/new_excel.xlsx", ext=None):# 获取文件夹及其子文件夹下所有的图片self.getFileList(file_url, ext)# 写入excelself.white_excel(filename)

先获取到所有图片的路径,再一一写入excel,就是这么简单

6、使用

if __name__ == '__main__':# client_id 为官网获取的AK, client_secret 为官网获取的SK 两参数为必传p1 = ID_OCR(client_id="client_id", client_secret="client_secret")"""file_url 必传:存放图片的文件夹,可写相对路径和绝对路径filename 选传:生成的excel的名字,默认为"/new_excel.xlsx"ext 选传:文件夹下图片的类型,默认为全部类型"""p1.run(file_url="imagesss", filename="/never_give_up.xlsx", ext="jpg")

只需要传最多五个参数!你就能得到一个完整的excel!

最后,完整代码附上!只要把第一部分百度智能云的工作做好了,复制这段代码,导入没有的库,基本上就能直接使用了

完整代码

# encoding:utf-8import requestsimport osimport base64import winregimport xlsxwriterclass ID_OCR:def __init__(self, client_id, client_secret):self.request_url = "/rest/2.0/ocr/v1/idcard"self.client_id = client_idself.client_secret = client_secretself.token = self.get_token()self.file_list = []# 获取tokendef get_token(self):hosts = '/oauth/2.0/token?grant_type=client_credentials&client_id={}&client_secret={}'.format(self.client_id, self.client_secret)res = requests.get(hosts)return res.json().get("access_token") if res else None# 遍历所有文件及子文件下的图片def getFileList(self, dirs, ext=None):"""输入 dir:文件夹根目录输入 ext: 扩展名"""if os.path.isfile(dirs):if ext is None:self.file_list.append(dirs)else:if ext in dirs[-3:]:self.file_list.append(dirs)elif os.path.isdir(dirs):for s in os.listdir(dirs):newDir = os.path.join(dirs, s)self.getFileList(newDir, ext)# 获取本地桌面路径@staticmethoddef get_desktop():key = winreg.OpenKey(winreg.HKEY_CURRENT_USER,r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders')return winreg.QueryValueEx(key, "Desktop")[0]# 写入exceldef white_excel(self, file_name):url = self.get_desktop() + file_name # 桌面路径与文件名相加workbook = xlsxwriter.Workbook(url) # 新建excel表,可写不使用以上函数自己写入要保存的路径worksheet = workbook.add_worksheet() # 新建sheet,也可设置为sheet的名称为"sheet1"等自定义字段headings = ['姓名', "民族", '性别', '住址', '公民身份号码'] # 设置表头数据worksheet.write_row('A1', headings) # 插入表头for i in range(2, len(self.file_list) + 2): # 遍历file_listdata = self.post_api(self.file_list[i - 2]) # 调用self.post_api获取dataworksheet.write_row("A" + str(i), data) # 写入一行workbook.close() # 将excel文件保存关闭# 调用apidef post_api(self, img_url):""":param img_url: 图片路径:return: 列表 ,内容为【"姓名","民族","住址","性别","公民身份号码"】"""f = open(img_url, 'rb') # 打开文件img = base64.b64encode(f.read()) # 以二进制的形式打开图片params = {"id_card_side": "front", "image": img} # 写入body参数request_url = self.request_url + "?access_token=" + self.token # 修改请求urlheaders = {'content-type': 'application/x-www-form-urlencoded'} # 写入headers参数response = requests.post(request_url, data=params, headers=headers) # 发送post请求并获取响应data = []if response:print(response.json())try:name = response.json().get("words_result").get("姓名").get("words")mz = response.json().get("words_result").get("民族").get("words")zz = response.json().get("words_result").get("住址").get("words")xb = response.json().get("words_result").get("性别").get("words")sfz = response.json().get("words_result").get("公民身份号码").get("words")data = [name, mz, xb, zz, sfz]except:passreturn datadef run(self, file_url, filename="/new_excel.xlsx", ext=None):# 获取文件夹及其子文件夹下所有的图片self.getFileList(file_url, ext)# 写入excelself.white_excel(filename)if __name__ == '__main__':# client_id 为官网获取的AK, client_secret 为官网获取的SK 两参数为必传p1 = ID_OCR(client_id="client_id", client_secret="client_secret")"""file_url 必传:存放图片的文件夹,可写相对路径和绝对路径filename 选传:生成的excel的名字,默认为"/new_excel.xlsx"ext 选传:文件夹下图片的类型,默认为全部类型"""p1.run(file_url="imagesss", filename="/never_give_up.xlsx", ext="jpg")

Everything is goingsmoothly.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。