python账单查询软件_利用Python批量识别电子账单数据的方法

本文介绍如何使用Python结合百度OCR接口批量识别电子账单,并将识别结果保存到Excel文件中,详细步骤包括申请百度OCR接口、调用接口识别文字以及分割图片提高识别准确率。
摘要由CSDN通过智能技术生成

一、前言

有一定数量类似如下截图所示的账单,利用 Python 批量识别电子账单数据,并将数据保存到Excel。

53bcc37c91d25c35781361b56390af9d.png

百度智能云接口

打开https://cloud.baidu.com/,如未注册请先注册,然后登录点击管理控制台,点击左侧产品服务→人工智能→文字识别,点击创建应用,输入应用名称如Baidu_OCR,选择用途如学习办公,最后进行简单应用描述,即可点击立即创建。会出现应用列表,包括AppID、API Key、Secret Key等信息,这些稍后会用到。

94f0bee879acb7af59b9102674f093a6.png

eb98ed47939fe0ac8a2bd6fac3cca7f1.png

二、调用Baidu aip识别

首先需要安装百度的接口,命令行输入如下:

pip install baidu-aip -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

查看 Python 的 SDK 文档:

93c2689c58e09c5b191d28b9e3850c39.png

eb1118b7eed71a8dc27acfcadd788c4f.png

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)

识别出如下图片中的文字,示例如下:

4a333782227afe36b760418036f0f44e.png

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)

结果如下:

c8eb3f66b6d35fe0a41ba1cfb2abef3a.png

三、批量识别电子账单

获取所有待识别的电子账单图像

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)) # 转成str

img_file = str(img_file)

print(img_file)

为了增加识别准确率,将账单上要提取的数据区域分割出来,再调用Baidu aip识别。

d53e386fb9d2a40d0d72a97aa41d7c8b.png

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))

cab20e5d93a65b115b41a295457b667a.png

发现调用 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')

结果如下:

5682a4018791c0e6b951b191fdf2da13.png

097635344cbaff703e1d9383808779c9.png

识别结果还不错,成功利用 Python 批量识别电子账单数据,并将数据保存到Excel。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值