python调用百度AI自动识别并提取图片上指定位置的文字信息

这是一个三个月前的项目需求,需要识别多张图片上固定位置的信息并提取。说到python 上文字识别,可能有些人想用 pytesseract 来做,怎么说呢,识别精准度相对较低,而且对于数量较大的图片来说,不可能再去人工的去检查识别的数据的准确性。
在经历过多次尝试后,最后选择调用百度AI的通用文字识别接口来实现这一功能,目前这一服务是免费使用的,只是对请求量和QPS有限制!如下图所示:

使用过程如下:

1. 进入百度AI开发平台,创建应用并获取access_token

https://ai.baidu.com/
在这里插入图片描述
在这里插入图片描述
1.1 选择创建应用
填写相关信息,即可创建成功
在这里插入图片描述
1.2 查看对应的 API Key 、Secret Key
然后在点击管理应用即可查看该应用对应的 API Key 、Secret Key
在这里插入图片描述
1.3 获取 access_token
使用如下代码获取 access_token


```python
import requests
# client_id 为官网获取的API Key, client_secret 为官网获取的Secret Key
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=?     &client_secret=?'
response = requests.get(host)
if response:
    print(response.json()['access_token'])

2.对图片中固定位置进行识别并提取

方法:是将图片中固定位置的图像进行裁剪,对裁剪后的图像进行单独识别。由于存在QPS的限制,所以设置了请求延时,保证不会超过QPS(Queries-per-second,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。)而报错,下面提供方法代码:

def OCRlatlon(filePah):
    identification_results = []
    img = Image.open(filePah)
    basicpath = "C:/Users/Admin/Desktop/中转/"
    # crop里对应的数值为该位置图像在整体图片中左上和右下两个点的像素坐标
    cropped1 = img.crop((1131, 917, 1159, 941))  
    cropped1.save(basicpath+"1.png")
    cropped2 = img.crop((1131, 942, 1208, 966)) 
    cropped2.save(basicpath+"2.png")
    cropped3 = img.crop((1066, 815, 1093, 839)) 
    cropped3.save(basicpath+"3.png")
    cropped4 = img.crop((1099, 815, 1154, 839))  
    cropped4.save(basicpath+"4.png")
    cropped5 = img.crop((1065, 840, 1102, 862))  
    cropped5.save(basicpath+"5.png")
    cropped6 = img.crop((1108, 840, 1163, 862)) 
    cropped6.save(basicpath+"6.png")
    cropped7 = img.crop((898, 50, 934, 70))
    cropped7.save(basicpath+"7.png")
    cropped8 = img.crop((50, 0, 104, 25))  
    cropped8.save(basicpath+"8.png")
    cropped9 = img.crop((50, 23, 106, 47)) 
    cropped9.save(basicpath+"9.png")
    for f in range(1, 10):
        imgpath = basicpath + str(f) + '.png'
        g = open(imgpath, 'rb')
        img = base64.b64encode(g.read())
        if f == 1 or f == 3 or f == 5 or f == 7 or f == 9:
            time.sleep(1) # 防止超过QPS限制 引发报错
        request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic"
        params = {"image": img}
        access_token = ''# 对应申请的  access_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:
            json_str = response.content.decode()
            data = json.loads(json_str)
            msg = data['words_result']
            print(msg)
            for m in msg:
                msg_info = m.get('words')
        identification_results.append(msg_info)
        g.close()
        os.remove(basicpath + str(f) + ".png")
    return identification_results

在这里需要注意的是,access_token 会变化,大概是一个月左右
由于我处理的图片数据量比较大,且图片是一个类型只是多个位置文字不同,所以采用此种方法十分方便。
建议 图片裁剪过小或者图像较为模糊的时候,建议使用opencv里面的图像腐蚀和清晰等方法来处理裁剪后的图像再进行识别,这样识别精准度会更高,具体参数需要自己去实际摸索,所以这部分代码我就不贴了。
最后,不得不说百度AI的还是很强的!

  • 0
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值