这是一个三个月前的项目需求,需要识别多张图片上固定位置的信息并提取。说到python 上文字识别,可能有些人想用pytesseract来做,怎么说呢,识别精准度相对较低,而且对于数量较大的图片来说,不可能再去人工的去检查识别的数据的准确性。
在经历过多次尝试后,最后选择调用百度AI的通用文字识别接口来实现这一功能,目前这一服务是免费使用的,只是对请求量和QPS有限制!如下图所示:
使用过程如下:
1. 进入百度AI开发平台,创建应用并获取access_token
/
1.1 选择创建应用
填写相关信息,即可创建成功
1.2 查看对应的 API Key 、Secret Key
然后在点击管理应用即可查看该应用对应的 API Key 、Secret Key
1.3 获取 access_token
使用如下代码获取 access_token
```pythonimport requests# client_id 为官网获取的API Key, client_secret 为官网获取的Secret Keyhost = '/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 = "/rest/2.0/ocr/v1/general_basic"params = {"image": img}access_token = ''# 对应申请的 access_tokenrequest_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: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的还是很强的!
如果觉得《python调用百度AI自动识别并提取图片上指定位置的文字信息》对你有帮助,请点赞、收藏,并留下你的观点哦!