一、前言
有一定数量类似如下截图所示的账单,利用 Python 批量识别电子账单数据,并将数据保存到Excel。
百度智能云接口
打开https://cloud.baidu.com/,如未注册请先注册,然后登录点击管理控制台,点击左侧产品服务→人工智能→文字识别,点击创建应用,输入应用名称如Baidu_OCR,选择用途如学习办公,最后进行简单应用描述,即可点击立即创建。会出现应用列表,包括AppID、API Key、Secret Key等信息,这些稍后会用到。
二、调用Baidu aip识别
首先需要安装百度的接口,命令行输入如下:
pip install baidu-aip -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
查看 Python 的 SDK 文档:
AipOcr是 OCR 的 Python SDK 客户端,为使用 OCR 的开发人员提供了一系列的交互方法。参考如下代码新建一个AipOcr:
from aip import AipOcr """ 你的 APPID AK SK """ APP_ID = '你的 App ID' API_KEY = '你的 Api Key' SECRET_KEY = '你的 Secret Key' client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
用户向服务请求识别某张图中的所有文字
""" 读取图片 """ def get_file_content(filePath): with open(filePath, 'rb') as fp: return fp.read() image = get_file_content('example.jpg') """ 调用通用文字识别, 图片参数为本地图片 """ client.basicGeneral(image) """ 调用通用文字识别(高精度版) 图片参数为本地图片 """ client.basicAccurate(image)
识别出如下图片中的文字,示例如下:
from aip import AipOcr # """ 改成你的 百度云服务的 ID AK SK """ APP_ID = '18690701' API_KEY = 'QFaTVXvZdPrR05dNlR5I49xA' SECRET_KEY = '*******************************' client = AipOcr(APP_ID, API_KEY, SECRET_KEY) def get_file_content(filePath): with open(filePath, 'rb') as fp: return fp.read() image = get_file_content('example.jpg') # 调用通用文字识别, 图片参数为本地图片 result = client.basicGeneral(image) print(result) # 提取识别结果 info = '\n'.join([i['words'] for i in result['words_result']]) print(info)
结果如下:
三、批量识别电子账单
获取所有待识别的电子账单图像
from pathlib import Path # 换成你放图片的路径 p = Path(r'D:\test\test_img') # 得到所有文件夹下 .jpg 图片 file = p.glob('**/*.jpg') for img_file in file: print(type(img_file)) # <class 'pathlib.WindowsPath'> 转成str img_file = str(img_file) print(img_file)
为了增加识别准确率,将账单上要提取的数据区域分割出来,再调用Baidu aip识别。
from pathlib import Path import cv2 as cv from aip import AipOcr from time import sleep APP_ID = '18690701' API_KEY = 'QFaTVXvZdPrR05dNlR5I49xA' SECRET_KEY = '**********************************' client = AipOcr(APP_ID, API_KEY, SECRET_KEY) """ 读取图片 """ def get_file_content(filePath): with open(filePath, 'rb') as fp: return fp.read() def identity(num): result_list = [] for i in range(num): image = get_file_content('img{}.jpg'.format(i)) """ 调用通用文字识别, 图片参数为本地图片 """ result = client.basicGeneral(image) print(result) sleep(2) # 识别结果 info = ''.join([i['words'] for i in result['words_result']]) result_list.append(info) print(result_list) src = cv.imread(r'D:\test\test_img\001.jpg') src = cv.resize(src, None, fx=0.5, fy=0.5) # print(src.shape) img = src[280:850, 10:580] # 截取图片 高 宽 money = img[70:130, 150:450] # 支出 收入金额 goods = img[280:330, 160:560] # 商品 time_1 = img[380:425, 160:292] # 支付时间 年月日 time_2 = img[380:425, 160:390] # 支付时间 完整 way = img[430:475, 160:560] # 支付方式 num_1 = img[480:520, 160:560] # 交易单号 num_2 = img[525:570, 160:560] # 商户单号 img_list = [money, goods, time_1, time_2, way, num_1, num_2] for index_, item in enumerate(img_list): cv.imwrite(f'img{index_}.jpg', item) identity(len(img_list))
发现调用 client.basicGeneral(image),通用文字识别,-5.90识别成590,而图像里支付时间年月日 时分秒之间间隔小,识别出来都在一起了,需要把支付时间的年月日 时分秒分别分割出来识别,调用 client.basicAccurate(image),通用文字识别(高精度版)。
完整实现如下:
""" @File :test_01.py @Author :叶庭云 @CSDN :https://yetingyun.blog.csdn.net/ """ from aip import AipOcr from pathlib import Path import cv2 as cv from time import sleep import openpyxl wb = openpyxl.Workbook() sheet = wb.active sheet.append(['消费', '商品', '支付时间', '支付方式', '交易单号', '商品单号']) # """ 改成你的 百度云服务的 ID AK SK """ APP_ID = '18690701' API_KEY = 'QFaTVXvZdPrR05dNlR5I49xA' SECRET_KEY = '*******************************' client = AipOcr(APP_ID, API_KEY, SECRET_KEY) """ 读取图片 """ def get_file_content(filePath): with open(filePath, 'rb') as fp: return fp.read() def identity(num): result_list = [] for i in range(num): image = get_file_content('img{}.jpg'.format(i)) """ 调用通用文字识别, 图片参数为本地图片 """ result = client.basicAccurate(image) print(result) sleep(1) # 识别结果 info = ''.join([i['words'] for i in result['words_result']]) result_list.append(info) result_list[2] = result_list[2] + ' ' + result_list[3] result_list.pop(3) print(result_list) sheet.append(result_list) # 换成你放图片的路径 p = Path(r'D:\test\test_img') # 得到所有文件夹下 .jpg 图片 file = p.glob('**/*.jpg') for img_file in file: img_file = str(img_file) src = cv.imread(r'{}'.format(img_file)) src = cv.resize(src, None, fx=0.5, fy=0.5) # print(src.shape) img = src[280:850, 10:580] # 截取图片 高、宽范围 money = img[70:130, 150:450] # 支出金额 goods = img[280:330, 160:560] # 商品 time_1 = img[380:425, 160:292] # 支付时间 年月日 time_2 = img[380:425, 290:390] # 支付时间 时分秒 way = img[430:475, 160:560] # 支付方式 num_1 = img[480:520, 160:560] # 交易单号 num_2 = img[525:570, 160:560] # 商户单号 img_list = [money, goods, time_1, time_2, way, num_1, num_2] for index_, item in enumerate(img_list): cv.imwrite(f'img{index_}.jpg', item) identity(len(img_list)) # cv.imshow('img', img) # cv.imshow('goods', time_2) # cv.waitKey(0) wb.save(filename='识别账单结果.xlsx')
结果如下:
识别结果还不错,成功利用 Python 批量识别电子账单数据,并将数据保存到Excel。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]