利用Python批量识别电子账单数据的方法


Posted in Python onFebruary 08, 2021

一、前言

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

利用Python批量识别电子账单数据的方法

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

利用Python批量识别电子账单数据的方法

利用Python批量识别电子账单数据的方法

二、调用Baidu aip识别

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

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

查看 Python 的 SDK 文档:

利用Python批量识别电子账单数据的方法

利用Python批量识别电子账单数据的方法

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)

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

利用Python批量识别电子账单数据的方法

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)

结果如下:

利用Python批量识别电子账单数据的方法

三、批量识别电子账单

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

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识别。

利用Python批量识别电子账单数据的方法

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

利用Python批量识别电子账单数据的方法

发现调用 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批量识别电子账单数据的方法

利用Python批量识别电子账单数据的方法

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

到此这篇关于利用Python批量识别电子账单数据的文章就介绍到这了,更多相关Python识别电子账单内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
在Django中同时使用多个配置文件的方法
Jul 22 Python
详解python并发获取snmp信息及性能测试
Mar 27 Python
Python编程django实现同一个ip十分钟内只能注册一次
Nov 03 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
Dec 03 Python
numpy中的delete删除数组整行和整列的实例
May 09 Python
python 获取等间隔的数组实例
Jul 04 Python
python Pillow图像处理方法汇总
Oct 16 Python
使用python实现画AR模型时序图
Nov 20 Python
python中if及if-else如何使用
Jun 02 Python
Keras:Unet网络实现多类语义分割方式
Jun 11 Python
python属于软件吗
Jun 18 Python
Python pygame实现中国象棋单机版源码
Jun 20 Python
Python命令行参数argv和argparse该如何使用
Feb 08 #Python
python 实现Requests发送带cookies的请求
Feb 08 #Python
PyCharm2020.3.2安装超详细教程
Feb 08 #Python
python 30行代码实现蚂蚁森林自动偷能量
Feb 08 #Python
如何用Python编写一个电子考勤系统
Feb 08 #Python
python编程的核心知识点总结
Feb 08 #Python
python上下文管理器异常问题解决方法
Feb 07 #Python
You might like
PHP5 字符串处理函数大全
2010/03/23 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
PHP图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
利用laravel搭建一个迷你博客实战教程
2017/08/13 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
jquery自动将form表单封装成json的具体实现
2014/03/17 Javascript
Javascript模拟加速运动与减速运动代码分享
2014/12/11 Javascript
基于jQuery实现点击弹出层实例代码
2016/01/01 Javascript
JavaScript实现简单的日历效果
2016/09/25 Javascript
bootstrap监听滚动实现头部跟随滚动
2016/11/08 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
基于JavaScript实现自动更新倒计时效果
2016/12/19 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
js中setTimeout的妙用--防止循环超时
2017/03/06 Javascript
js绑定事件和解绑事件
2017/04/27 Javascript
详解vue.js移动端导航navigationbar的封装
2017/07/05 Javascript
JavaScript实现购物车基本功能
2017/07/21 Javascript
vue组件name的作用小结
2018/05/23 Javascript
vue 表单验证按钮事件交由父组件触发的方法
2018/12/17 Javascript
Layui多选只有最后一个值的解决方法
2019/09/02 Javascript
layer.open回调获取弹出层参数的实现方法
2019/09/10 Javascript
JavaScript实现背景自动切换小案例
2019/09/27 Javascript
Ajax获取node服务器数据的完整步骤
2020/09/20 Javascript
Python中的MongoDB基本操作:连接、查询实例
2015/02/13 Python
python从入门到精通(DAY 2)
2015/12/20 Python
Python中字典(dict)合并的四种方法总结
2017/08/10 Python
对python dataframe逻辑取值的方法详解
2019/01/30 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
分享一个H5原生form表单的checkbox特效代码
2018/02/26 HTML / CSS
AC Lens:购买隐形眼镜
2017/02/26 全球购物
党的群众路线教育实践活动个人承诺书
2014/05/22 职场文书
2014年药店工作总结
2014/11/20 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
行政处罚事先告知书
2015/07/01 职场文书
JavaScript前端面试扁平数据转tree与tree数据扁平化
2022/06/14 Javascript