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

百度智能云配置

一、登录

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

地址: https://cloud.baidu.com/product/ocr_cards

二、创建应用

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

 三、领取免费资源

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

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


编码

一切准备就绪,开搞开搞

一、单张图片处理

1.、获取Access Token

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

官方api文档:

# encoding:utf-8
import requests 

# client_id 为官网获取的AK, client_secret 为官网获取的SK
host = 'https://aip.baidubce.com/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-8

import requests
import base64

'''
身份证识别
'''

request_url = "https://aip.baidubce.com/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_token
headers = {'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-8
import requests
import os
import base64
import winreg
import xlsxwriter


class ID_OCR:

    def __init__(self, client_id, client_secret):
        self.request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard"
        self.client_id = client_id
        self.client_secret = client_secret
        self.token = self.get_token()
        self.file_list = []

    # 获取token
    def get_token(self):
        hosts = 'https://aip.baidubce.com/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

# 写入excel
    def 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_list
            data = self.post_api(self.file_list[i - 2])  # 调用self.post_api获取data
            worksheet.write_row("A" + str(i), data)  # 写入一行
        workbook.close()  # 将excel文件保存关闭


# 获取本地桌面路径
    @staticmethod
    def 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,可查看我刚入坑时的文章:https://blog.csdn.net/Runaway_pilot

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

4、调用API

# 调用api
    def 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  # 修改请求url
        headers = {'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:
                pass
        return data

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

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

5、流程控制

    def run(self, file_url, filename="/new_excel.xlsx", ext=None):
        # 获取文件夹及其子文件夹下所有的图片
        self.getFileList(file_url, ext)
        # 写入excel
        self.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-8
import requests
import os
import base64
import winreg
import xlsxwriter


class ID_OCR:

    def __init__(self, client_id, client_secret):
        self.request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard"
        self.client_id = client_id
        self.client_secret = client_secret
        self.token = self.get_token()
        self.file_list = []

    # 获取token
    def get_token(self):
        hosts = 'https://aip.baidubce.com/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)

    # 获取本地桌面路径
    @staticmethod
    def get_desktop():
        key = winreg.OpenKey(winreg.HKEY_CURRENT_USER,
                             r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders')
        return winreg.QueryValueEx(key, "Desktop")[0]

    # 写入excel
    def 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_list
            data = self.post_api(self.file_list[i - 2])  # 调用self.post_api获取data
            worksheet.write_row("A" + str(i), data)  # 写入一行
        workbook.close()  # 将excel文件保存关闭

    # 调用api
    def 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  # 修改请求url
        headers = {'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:
                pass
        return data

    def run(self, file_url, filename="/new_excel.xlsx", ext=None):
        # 获取文件夹及其子文件夹下所有的图片
        self.getFileList(file_url, ext)
        # 写入excel
        self.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 going smoothly.

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值