利用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 相关文章推荐
浅谈Python中copy()方法的使用
May 21 Python
实例解析Python中的__new__特殊方法
Jun 02 Python
Python 由字符串函数名得到对应的函数(实例讲解)
Aug 10 Python
Django+Xadmin构建项目的方法步骤
Mar 06 Python
python进程和线程用法知识点总结
May 28 Python
Python中的asyncio代码详解
Jun 10 Python
PyQt5根据控件Id获取控件对象的方法
Jun 25 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
Feb 27 Python
Python应用实现处理excel数据过程解析
Jun 19 Python
python实现最短路径的实例方法
Jul 19 Python
sublime3之内网安装python插件Anaconda的流程
Nov 10 Python
简单谈谈Python面向对象的相关知识
Jun 28 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
php获取文件大小的方法
2014/02/26 PHP
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
php跨服务器访问方法小结
2015/05/12 PHP
详解PHP实现执行定时任务
2015/12/21 PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
2017/06/28 PHP
web 页面分页打印的实现
2009/06/22 Javascript
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
JS的反射问题
2010/04/07 Javascript
js中格式化日期时间型数据函数代码
2010/11/08 Javascript
JavaScript高级程序设计 读书笔记之八 Function类及闭包
2012/02/27 Javascript
js几秒以后倒计时跳转示例
2013/12/26 Javascript
JS实现选择TextArea内文本的方法
2015/08/03 Javascript
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
2017/06/29 jQuery
vue自定v-model实现表单数据双向绑定问题
2018/09/03 Javascript
js实现盒子滚动动画效果
2020/08/09 Javascript
vue 动态给每个页面添加title、关键词和描述的方法
2020/08/28 Javascript
JS pushlet XMLAdapter适配器用法案例解析
2020/10/16 Javascript
Python中Iterator迭代器的使用杂谈
2016/06/20 Python
Python 编码处理-str与Unicode的区别
2016/09/06 Python
Python脚本实时处理log文件的方法
2016/11/21 Python
python中MethodType方法介绍与使用示例
2017/08/03 Python
解决yum对python依赖版本问题
2019/07/05 Python
python实现基于朴素贝叶斯的垃圾分类算法
2019/07/09 Python
使用python分析统计自己微信朋友的信息
2019/07/19 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
写出SQL四条最基本的数据操作语句(DML)
2012/12/12 面试题
导购员的岗位职责
2014/02/08 职场文书
党员自评材料范文
2014/12/17 职场文书
元旦晚会主持词开场白
2015/05/28 职场文书
python如何进行基准测试
2021/04/26 Python
Pytorch 中net.train 和 net.eval的使用说明
2021/05/22 Python
python 实现体质指数BMI计算
2021/05/26 Python
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android