一、前言

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

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

二、调用baidu aip识别

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

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

查看 python 的 sdk 文档:

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)

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

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)

结果如下:

三、批量识别电子账单

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

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

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

发现调用 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 批量识别电子账单数据,并将数据保存到excel。

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