Google Cloud Vision API の OCR 機能でレシートを読んでみる
題の通り。
趣味で家計簿アプリをちまちま作っているんですが、レシートを読んで支払った金額を入力する機能が実装できるかどうか検証するために触ってみました。事前に GCP Console でプロジェクトを作ったり、API キーを発行しておきます。
コードはこんなかんじです。
import base64 import json import requests def detect_text(path): with open(path, 'rb') as image_file: content = base64.b64encode(image_file.read()) content = content.decode('utf-8') api_key = "YOUR_API_KEY" url = "https://vision.googleapis.com/v1/images:annotate?key=" + api_key headers = { 'Content-Type': 'application/json' } request_body = { 'requests': [ { 'image': { 'content': content }, 'features': [ { 'type': "TEXT_DETECTION", 'maxResults': 10 } ] } ] } response = requests.post( url, json.dumps(request_body), headers ) result = response.json() print(result['responses'][0]['textAnnotations'][0]['description']) if __name__ == '__main__': detect_text("receipt.jpg")
今回読んでみたレシート
結果
サンつコ 渋谷マークシティ店 電話 03-3464-2593 領収書 合計 ¥1 57 (うち消費税等 8.0% ¥11) ルジット支払 ¥1 57 クレジット売上票 お客様控え ルジット支払額 ¥157 会社名 JCB 会員NO お取扱日 承認番号 0927657 店舗名 サンクス 渋谷マークシティ店
けっこうちゃんと読めてますね。上のリストをなめて、「合計」が含まれる行の後ろの行を金額として扱えば大体うまくいくんじゃないかな、と思いました。また、「合計」が認識できなかった場合は、 \¥(\d|\s)+
の正規表現パターンにマッチする行を取り出して、入力の候補として選択させればよさそうです。