这个过程有点多,一步一步来。
一、文字识别
本人采用的是腾讯的云识别技术,所以先在腾讯完成一系列的注册、申请工作。
首先打开腾讯云的官网:https://cloud.tencent.com/
点击“入门”,这里面有大概需要的步骤:
https://cloud.tencent.com/product/generalocr/getting-started
开通文字识别的服务后:
这个按官方的说法是每个月可以免费使用1000次,还是很不错的。
开通服务后,还需要访问API的密钥,这个也需要申请,我这个是已申请好的:
二、实现效果
一张图片:
实现后的效果:
三、预安装相应的包
首先,要安装腾讯的组件包:tencentcloud-sdk-python。直接在线安装好像不得行,于是可以安装离线版,我这里下载后再安装的,包的名字叫:
pip install tencentcloud_sdk_python-3.0.330-py2.py3-none-any.whl
然后还安装了一个包:
pip install xlutils-2.0.0-py2.py3-none-any.whl
这两个包我已经上传了:
https://download.csdn.net/download/qiuqiuit/14927294
我的机子只安装了这两个,如果控制台有提示缺少包,可以自行再安装。
四、python实现
经过前面准备工作,下面把相应的代码贴出来:
image2excel.py:
# -*- coding: utf-8 -*-
import sys
import ocr
import xlrd
import yaml_class
from xlutils.copy import copy
pic_path = sys.argv[1]
print('doing...',pic_path)
# 使用ocr进行转换
config = yaml_class.get_yaml_data("config.yml")
trans = ocr.OCR()
path_excel = trans.img_to_excel(
pic_path,
image_path=pic_path,
secret_id=config['secret_id'],
secret_key=config['secret_key'],
)
old_excel = xlrd.open_workbook('output.xlsx')
new_excel = copy(old_excel)
ws = new_excel.get_sheet(0)
new_excel.save(pic_path+'.xls')
ocr.py:
# -*- coding: utf-8 -*-
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.ocr.v20181119 import ocr_client, models
import base64
# OCR识别封装
class OCR(object):
def img_to_excel(self,
output_file_name,
image_path,
secret_id,
secret_key):
# 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey
cred = credential.Credential(
secret_id,
secret_key
)
# 实例化client对象
httpProfile = HttpProfile()
httpProfile.endpoint = "ocr.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
clientProfile.signMethod = "TC3-HMAC-SHA256"
client = ocr_client.OcrClient(cred, "ap-shanghai", clientProfile)
# 实例化一个请求对象
req = models.GeneralFastOCRRequest()
# 读取图片数据,使用Base64编码
with open(image_path, 'rb') as f:
image = f.read()
image_base64 = str(base64.b64encode(image), encoding='utf-8')
req.ImageBase64 = image_base64
# 通过client对象调用访问接口,传入请求对象
resp = client.TableOCR(req)
# 获取返回数据(Data为Base64编码后的Excel数据)
data = resp.Data
# 转换为Excel
output_file_name = str(output_file_name)
path_excel = output_file_name+".xlsx"
with open(path_excel, 'wb') as f:
f.write(base64.b64decode(data))
return path_excel
yaml读取配置文件(yaml_class.py):
# -*- coding: utf-8 -*-
import yaml
def get_yaml_data(yaml_file):
# 打开yaml文件
file = open(yaml_file, 'r', encoding="utf-8")
file_data = file.read()
file.close()
# 将字符串转化为字典或列表
data = yaml.load(file_data)
return data
config.yml:
# -*- coding: utf-8 -*-
secret_id: AKIDPzLSHRK3bZUCSyCF3Z45Bj0LRHs0Ynzb
secret_key: Qa5QeYKwIQI4ZxDQFq663jIs********
虽然没得讲得很详细,但基本步骤就是这些,这样就可以利用腾讯的云服务,把excel图片识别出来,再转换成excel文件。
(2021.2.1更新)
上面ocr.py代码更详细的解释,可以看官方的例子:TencentCloud / tencentcloud-sdk-python
ocr.py是改装的关键,所以最近又深入了解了一下,甚至可以看看源代码:ocr_client.py与models.py源代码
文字识别,也分很多种接口,通用文字、卡证文字、票据单据、汽车相关、行业文档等多场景下的印刷体、手写体文字识别:https://cloud.tencent.com/document/product/866/49525
每个人的需求不同,所以很有必要深入学习下。比如表格识别,就有两个版本:
而我们上面的ocr.py采用的是V1版本,现在已经不推荐使用了,可以改成V2版本。V2版本的公共接口是RecognizeTableOCR,对应上面的代码改动如下:
# 通过client对象调用访问接口,传入请求对象
resp = client.RecognizeTableOCR(req)
另外,还有一个比较关键的东西,那就是识别对象是哪种,印刷体,还是手写体、英文体?上面的ocr.py用的是GeneralFastOCR,即印刷体。
总的来说,ocr.py作用的就是通过GeneralFastOCR识别印刷字体,然后通过RecognizeTableOCR转换成excel表格。如果需要识别手写体怎么办?
需要修改models.GeneralFastOCRRequest:
# 实例化一个请求对象
req = models.GeneralHandwritingOCRRequest()
...
# 通过client对象调用访问接口,传入请求对象
resp = client.RecognizeTableOCR(req)
data = resp.Data
还有那个服务器地域,可以取以下值:
华北地区(北京) | ap-beijing |
华南地区(广州) | ap-guangzhou |
港澳台地区(中国香港) | ap-hongkong |
亚太东北(首尔) | ap-seoul |
华东地区(上海) | ap-shanghai |
亚太东南(新加坡) | ap-singapore |
北美地区(多伦多) | na-toronto |
也就是离哪个服务器近就选哪个。