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)+正規表現パターンにマッチする行を取り出して、入力の候補として選択させればよさそうです。