Google Cloud Vision API の中の文字認識(TEXT DETECTION)について書いてる記事が少なかったのと、自分が躓いたりしたりしたので、ここにメモしておく。
APIKEYの発行の仕方等々については以下のサイトを参考にした。
Google Cloud Vision APIの使い方まとめ
環境
- Windows10
- Python3.6.3
- プログラムはbash上で実行
コード
import requests import json import base64 # 画像はbase64でエンコードする必要があるため API_KEY = "自分のAPIKEY" def text_detection(image_path): api_url = 'https://vision.googleapis.com/v1/images:annotate?key={}'.format(API_KEY) with open(image_path, "rb") as img: image_content = base64.b64encode(img.read()) req_body = json.dumps({ 'requests': [{ 'image': { 'content': image_content.decode('utf-8') # base64でエンコードしたものjsonにするためdecodeする }, 'features': [{ 'type': 'TEXT_DETECTION' }] }] }) res = requests.post(api_url, data=req_body) return res.json() if __name__ == "__main__": img_path = "画像のpath" res_json = text_detection(img_path) res_text = res_json["responses"][0]["textAnnotations"][0]["description"] #print(json.dumps(res_json, indent=4, sort_keys=True, ensure_ascii=False)) print(res_text) with open("result.json", "w") as js: #json.dump(res_json, js, indent=4, ensure_ascii=False) js.write(res_text)
実行結果
まずは英語
入力
出力
facebook
いけるやん
日本語はどないや?
入力
出力
に ほ ん ご であそぼ
あぁ^~いいっすねぇ^~
こんな感じで結構いけます。
自分が引っかかった部分
画像はbase64でエンコードし、
json.dumps()
をする際には画像がbase64,つまりバイト列になってるのでこれをdecode("utf-8")
でutf-8にする必要がある。これをしないとエラーが出る。windowsの場合 bash などの環境で実行しないと
UnicodeEncodeError: 'cp932' codec can't encode character '\u3127' in position 507: illegal multibyte sequence
のようなクソみたいなエラーが出る。bashで実行する以外にも解決方法はあると思うが、bashで実行するのが一番手っ取り早い。他半数の人が既知だと思うがjsonからデータを取り出す時(今回の場合における
"description"
) は{}に囲まれてるだけなら["キー"]で良いが、
以下のような場合{"キー1":[{"キー2":0}]}
ここから["キー2"]を取り出すには
>["キー1"][0]["キー2"]
とする必要がある。このリストが混ざってる感じのやつは途中に挟まってるリストでは文字列ではなくインデックス番号を指定しなければいけない(よく考えれば当たり前)。 これに気づかずに30分くらい「う~ん」とか言ってた。
何か間違えやアドバイス等あればコメントください