利用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中pygame针对游戏窗口的显示方法实例分析(附源码)
Nov 11 Python
定制FileField中的上传文件名称实例
Aug 23 Python
python实现学生管理系统
Jan 11 Python
多个应用共存的Django配置方法
May 30 Python
python 多线程对post请求服务器测试并发的方法
Jun 13 Python
python射线法判断一个点在图形区域内外
Jun 28 Python
python爬取本站电子书信息并入库的实现代码
Jan 20 Python
将tensorflow模型打包成PB文件及PB文件读取方式
Jan 23 Python
浅谈Pytorch torch.optim优化器个性化的使用
Feb 20 Python
tensorflow模型转ncnn的操作方式
May 25 Python
详解Python中string模块除去Str还剩下什么
Nov 30 Python
python 模拟登陆163邮箱
Dec 15 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
中国第一家无线电行
2021/03/01 无线电
thinkphp3.0 模板中函数的使用
2012/11/13 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
微信扫描二维码登录网站代码示例
2013/12/30 PHP
10个php函数实用却不常见
2015/10/13 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
2017/10/12 PHP
JavaScript 动态改变图片大小
2009/06/11 Javascript
javascript下利用arguments实现string.format函数
2010/08/24 Javascript
JQuery live函数
2010/12/24 Javascript
js FLASH幻灯片字符串中有连接符&的处理方法
2012/03/01 Javascript
javascript动态向网页中添加表格实现代码
2014/02/19 Javascript
详解JavaScript中的Unescape()和String() 函数
2015/11/09 Javascript
原生javascript实现addClass,removeClass,hasClass函数
2016/02/25 Javascript
jQuery获取元素父节点的方法
2016/06/21 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
用jQuery实现可输入多选下拉组合框实例代码
2017/01/18 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
2018/01/24 Javascript
AngularJS 前台分页实现的示例代码
2018/06/07 Javascript
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
[00:52]玛尔斯技能全介绍
2019/03/06 DOTA
Python编程实现数学运算求一元二次方程的实根算法示例
2017/04/02 Python
Python操作MySQL数据库的三种方法总结
2018/01/30 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
基于Django框架的权限组件rbac实例讲解
2019/08/31 Python
python使用sklearn实现决策树的方法示例
2019/09/12 Python
python主线程与子线程的结束顺序实例解析
2019/12/17 Python
解决阿里云邮件发送不能使用25端口问题
2020/08/07 Python
canvas实现有递增动画的环形进度条的实现方法
2019/07/10 HTML / CSS
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
2014/04/10 HTML / CSS
德国W家官网,可直邮中国的母婴商城:Windeln.de
2021/03/03 全球购物
毕业生写求职信的要点
2014/03/04 职场文书
市场拓展计划书
2014/05/03 职场文书
职工擅自离岗检讨书
2014/09/23 职场文书
民警群众路线教育实践活动对照检查材料
2014/10/04 职场文书
2014银行授权委托书样本
2014/10/04 职场文书
解析Java中的static关键字
2021/06/14 Java/Android