利用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与shell的3种交互方式介绍
Apr 11 Python
Python的函数的一些高阶特性
Apr 27 Python
python中self原理实例分析
Apr 30 Python
python中装饰器级连的使用方法示例
Sep 29 Python
Python中装饰器学习总结
Feb 10 Python
机器学习之KNN算法原理及Python实现方法详解
Jul 09 Python
详解Python 装饰器执行顺序迷思
Aug 08 Python
让你Python到很爽的加速递归函数的装饰器
May 26 Python
解决torch.autograd.backward中的参数问题
Jan 07 Python
Python运算符+与+=的方法实例
Feb 18 Python
关于Python OS模块常用文件/目录函数详解
Jul 01 Python
python井字棋游戏实现人机对战
Apr 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
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
PHP配置心得包含MYSQL5乱码解决
2006/11/20 PHP
PHP如何抛出异常处理错误
2011/03/02 PHP
PHP多态代码实例
2015/06/26 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
PHP基于面向对象实现的留言本功能实例
2018/04/04 PHP
workerman结合laravel开发在线聊天应用的示例代码
2018/10/30 PHP
详解在YII2框架中使用UEditor编辑器发布文章
2018/11/02 PHP
jQuery Flash/MP3/Video多媒体插件
2010/01/18 Javascript
JavaScript CSS修改学习第一章 查找位置
2010/02/19 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
2013/05/24 Javascript
nodejs 中模拟实现 emmiter 自定义事件
2016/02/22 NodeJs
javascript的 {} 语句块详解
2016/02/27 Javascript
浅谈JavaScript的闭包函数
2016/12/08 Javascript
原生JS改变透明度实现轮播效果
2017/03/24 Javascript
浅谈Vue组件及组件的注册方法
2018/08/24 Javascript
JS使用setInterval计时器实现挑战10秒
2020/11/08 Javascript
python实现在windows下操作word的方法
2015/04/28 Python
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
python模块smtplib学习
2018/05/22 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
2018/09/14 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
Python全栈之列表数据类型详解
2019/10/01 Python
Python 动态变量名定义与调用方法
2020/02/09 Python
40行Python代码实现天气预报和每日鸡汤推送功能
2020/02/27 Python
Python通过2种方法输出带颜色字体
2020/03/02 Python
python 使用递归的方式实现语义图片分割功能
2020/07/16 Python
介绍一下XMLHttpRequest对象的常用方法和属性
2013/05/24 面试题
西安夏日科技有限公司Java笔试题
2013/01/11 面试题
开办化妆品公司创业计划书
2013/12/26 职场文书
国家助学金获奖感言
2014/01/31 职场文书
模特职业生涯规划范文
2014/02/26 职场文书
主题团日活动总结
2014/06/25 职场文书
windows server2008 开启端口的实现方法
2022/06/25 Servers
利用Redis实现点赞功能的示例代码
2022/06/28 Redis