1. 实际应用场景描述
在个人理财、企业报销、税务管理等领域,我们每天都会收到各种发票(纸质或电子图片)。
- 个人记账时,需要手动输入发票上的金额、日期、商家名称,费时费力。
- 企业财务需要批量处理大量发票,人工录入容易出错。
- 纸质发票不易保存,查找困难。
如果有一个智能程序,只需 拍摄发票照片,就能自动识别关键信息并生成 电子记账表,将极大提升效率,减少人为错误。
2. 痛点分析
1. 手动录入繁琐:每张发票都要逐字段输入。
2. 易出错:数字、日期格式不统一,容易录错。
3. 查找困难:纸质发票不易分类存储。
4. 批量处理难:企业财务面对大量发票时效率低下。
3. 核心逻辑讲解
3.1 图像预处理
- 对拍摄的发票照片进行灰度化、二值化、去噪等操作,提高 OCR 识别率。
- 可使用 OpenCV 进行边缘检测和倾斜校正。
3.2 OCR 文字识别
- 使用
"pytesseract"(Tesseract OCR 的 Python 封装)识别图片中的文字。
- 支持中文识别(需安装中文语言包)。
3.3 关键信息提取
- 使用 规则匹配 或 正则表达式 提取金额(如“¥123.45”)、日期(如“2024-12-31”)、商家名称(通常在发票顶部)。
- 可升级为 NLP 实体识别模型(如 BERT)提高准确率。
3.4 数据存储
- 将提取的信息存入 CSV 文件,形成电子记账表。
- 可扩展为 SQLite 或 Excel 文件。
4. 模块化代码(Python)
# invoice_ocr.py
import cv2
import pytesseract
import re
import csv
from datetime import datetime
class InvoiceOCR:
def __init__(self, output_csv='invoice_records.csv'):
self.output_csv = output_csv
# 初始化 CSV 文件
with open(self.output_csv, 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerow(['商家名称', '开票日期', '金额(元)', '识别时间'])
def preprocess_image(self, image_path):
"""图像预处理:灰度化、二值化、去噪"""
img = cv2.imread(image_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
denoised = cv2.medianBlur(thresh, 3)
return denoised
def ocr_image(self, image_path):
"""OCR 识别文字"""
processed_img = self.preprocess_image(image_path)
text = pytesseract.image_to_string(processed_img, lang='chi_sim+eng')
return text
def extract_info(self, text):
"""提取商家名称、日期、金额"""
# 商家名称:假设在文本前几行
lines = text.split('\n')
merchant = lines[0].strip() if lines else ''
# 日期:匹配 YYYY-MM-DD 或 YYYY/MM/DD
date_pattern = r'\d{4}[-/]\d{1,2}[-/]\d{1,2}'
date_match = re.search(date_pattern, text)
date = date_match.group() if date_match else ''
# 金额:匹配 ¥123.45 或 123.45元
amount_pattern = r'[¥¥]?\s*\d+\.\d{2}\s*[元]?'
amount_match = re.search(amount_pattern, text)
amount = amount_match.group().replace('¥', '').replace('¥', '').replace('元', '').strip() if amount_match else ''
return merchant, date, amount
def save_to_csv(self, merchant, date, amount):
"""保存到 CSV"""
with open(self.output_csv, 'a', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerow([merchant, date, amount, datetime.now().strftime('%Y-%m-%d %H:%M:%S')])
def process_invoice(self, image_path):
"""处理单张发票"""
print("正在识别发票...")
text = self.ocr_image(image_path)
print("识别文本:\n", text)
merchant, date, amount = self.extract_info(text)
print(f"商家:{merchant}, 日期:{date}, 金额:{amount}")
self.save_to_csv(merchant, date, amount)
print("已保存到电子记账表。")
def main():
ocr = InvoiceOCR()
image_path = input("请输入发票照片路径:").strip()
ocr.process_invoice(image_path)
if __name__ == "__main__":
main()
5. README 文件
# 发票自动识别与电子记账工具
基于 Python + OpenCV + Tesseract OCR,实现拍摄发票照片自动识别金额、日期、商家名称,并生成电子记账表。
## 功能
- 发票照片预处理
- OCR 文字识别(支持中英文)
- 关键信息提取
- 自动保存到 CSV 记账表
## 安装依赖
bash
pip install opencv-python pytesseract
> 需安装 [Tesseract OCR](https://github.com/tesseract-ocr/tesseract) 及中文语言包。
## 使用
bash
python invoice_ocr.py
输入发票照片路径,程序会自动识别并保存。
## 示例
输入照片路径后,输出:
商家:星巴克咖啡, 日期:2024-12-31, 金额:36.50
已保存到电子记账表。
6. 使用说明
1. 安装 Tesseract OCR 及中文语言包。
2. 安装 Python 依赖。
3. 运行脚本,输入发票照片路径。
4. 程序会识别并保存信息到
"invoice_records.csv"。
5. 可用 Excel 打开 CSV 查看记账表。
7. 核心知识点卡片
知识点 说明
OCR 技术 使用 Tesseract 将图像转为文本
图像预处理 灰度化、二值化、去噪提高识别率
正则表达式 提取金额、日期等结构化信息
CSV 操作 将数据持久化存储
可扩展性 可升级为 NLP 模型或接入财务系统
8. 总结
本项目展示了如何用 Python + OpenCV + Tesseract OCR + 规则提取 快速实现一个 发票自动识别与电子记账工具,解决了手动录入发票信息的痛点。
- 优点:自动化程度高、可批量处理、易于集成。
- 未来可引入 深度学习 OCR 模型(如 PaddleOCR、TrOCR)和 NLP 实体识别,提升复杂版式发票的识别准确率,并支持导出 Excel、对接财务软件。
- 适合作为 AI 方法与技术课程 的实践案例,涵盖图像处理、文本识别、数据提取与存储全流程。
如果你愿意,可以升级为 PaddleOCR 版本,并增加批量处理和 GUI 界面,让它更适合实际财务工作。
利用AI高效解决实际问题,如果你觉得这个工具好用,欢迎关注我!