質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

486閲覧

Google Cloud Vision APIで光学式文字認識をpythonで実装できない

Tsuyoshi777

総合スコア16

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/07/02 05:57

編集2019/07/02 11:15

Google Cloud Vision APIで光学式文字認識をpythonで実装しようとしているのですが、うまくテキストが表示されません。

実行の参考サイトは以下二つです。
https://qiita.com/AltGuNi/items/6f22f1441733da08fdc1

https://www.g104robo.com/entry/google-cloud-vision-api

実装したコードは以下になります。
APIキーは抜いています。

# -*- coding: utf-8 -*- import requests import base64 import json import os GOOGLE_CLOUD_VISION_API_URL = 'https://vision.googleapis.com/v1/images:annotate?key=' API_KEY = '' # 取得したAPIキーを入力してください。 # APIを呼び、認識結果をjson型で返す def request_cloud_vison_api(image_base64): api_url = GOOGLE_CLOUD_VISION_API_URL + API_KEY req_body = json.dumps({ 'requests': [{ 'image': { 'content': image_base64.decode('utf-8') # jsonに変換するためにstring型に変換する }, 'features': [{ 'type': 'TEXT_DETECTION', # ここを変更することで分析内容を変更できる 'maxResults': 10, }] }] }) res = requests.post(api_url, data=req_body) return res.json() # 画像読み込み def img_to_base64(filepath): filepath = 'img/text-tool03.png' with open(filepath, 'rb') as img: img_byte = img.read() return base64.b64encode(img_byte) # 文字認識させたい画像を./img.pngとする filepath = 'img/text-tool03.png' img_base64 = img_to_base64(filepath) result = request_cloud_vison_api(img_base64) #認識した文字の位置など、すべての情報を出力 #print("{}".format(json.dumps(result, indent=4))) #認識した文字のみを出力 def get_fullTextAnnotation(json_data): text_dict = json.loads(json_data) try: text_r = text_dict["responses"][0]["fullTextAnnotation"]["text"] return print(text_r) except: print(None) return None

出力結果は特にエラーがなく何も表示されません。
写真はimgフォルダに一枚入っています。
写真は「あいうえお」とシンプルに書いてあるものです。
ご教示いただけましたら幸いです。

宜しくお願い致します。

追記

# 文字認識させたい画像を./img.pngとする filepath = 'img' path = os.listdir(filepath) new_path = ','.join(path).replace(".DS_Store,","") new_dir_path = 'img/' + new_path img_base64 = img_to_base64(new_dir_path) result = request_cloud_vison_api(img_base64) **#認識した文字の位置など、すべての情報を出力 print("{}".format(json.dumps(result, indent=4)))** #認識した文字のみを出力 # def get_fullTextAnnotation(json_data): # text_dict = json.loads(json_data) # try: # text_r = text_dict["responses"][0]["fullTextAnnotation"]["text"] # return print(text_r) # except: # print(None) # return None

途中、print("{}".format(json.dumps(result, indent=4)))で出力した結果、以下が出ました。

{ "responses": [ {} ] }

これは、そもそも画像が読み込まれていないのでしょうか。

すいません、pathを違うもので書いてました。

def img_to_base64(filepath): filepath = 'img/text-tool03.png' with open(filepath, 'rb') as img: img_byte = img.read() return base64.b64encode(img_byte) # 文字認識させたい画像を./img.pngとする filepath = 'img/text-tool03.png' img_base64 = img_to_base64(filepath) result = request_cloud_vison_api(img_base64) #認識した文字の位置など、すべての情報を出力 print("{}".format(json.dumps(result, indent=4))) #認識した文字のみを出力 # def get_fullTextAnnotation(json_data): # text_dict = json.loads(json_data) # try: # text_r = text_dict["responses"][0]["fullTextAnnotation"]["text"] # return print(text_r) # except: # print(None) # return None

上記でも出力が同じでした。

変更前の写真は以下でした。
イメージ説明

ひらがなは読めないんでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tetsunosuke

2019/07/02 08:33

print(None) ではなく except Exception as e: print(e) した場合は何か出力されるのでしょうか?
Tsuyoshi777

2019/07/02 08:52

質問ありがとうございます。 上記で打ってみましたが、変更前と同じでした。 出力は何も出ません。
tetsunosuke

2019/07/02 08:56

よく見たら、 get_fullTextAnnotationは使われてないですね・・・? print(get_fullTextAnnotation(result)) が必要でしょうか?
tetsunosuke

2019/07/02 09:18

> これは、そもそも画像が読み込まれていないのでしょうか。 突然話が複雑になっていますが... filepath = 'img/text-tool03.png' img_base64 = img_to_base64(filepath) result = request_cloud_vison_api(img_base64) print("{}".format(json.dumps(result, indent=4))) でも同じだったのでしょうか?
Tsuyoshi777

2019/07/02 09:25

同じでした。 print(get_fullTextAnnotation(result)) はどこに記載した方がいいでしょうか。
tetsunosuke

2019/07/02 09:32

もし同じだったのであれば、 responsesがほぼからの状況で get_fullTextAnnotation(result) しても 意味はなさそうですよね。 記載位置の想定は、 result = request_cloud_vison_api(img_base64) のあとでした。
Tsuyoshi777

2019/07/02 09:39

わかりました。ちょっと考えてみます。
Tsuyoshi777

2019/07/02 10:54

そうなんですね。普通にこのコードが書かれたpythonファイルをターミナルで読み込んで出力すればいいんでしょうか。そもそも根本的なことが間違っているような気がして‥、出力の仕方が違うのかなと思いました。
Tsuyoshi777

2019/07/02 11:01

curlコマンドを使うのでしょうか。
Tsuyoshi777

2019/07/02 11:13

写真を提示されているものに変えたら同じように出力が出ました! ただ、print("{}".format(json.dumps(result, indent=4)))が反映されただけで、以下コードのテキストだけの抽出が出てないので、考えます。
tetsunosuke

2019/07/02 12:05

とりあえずなんらかの解析をかけることは成功したのですね。よかった。 https://qiita.com/saken649/items/4bfd215bf943c36a52ab ひらがなが読めないわけではない、ようですよ。 > ただ、print("{}".format(json.dumps(result, indent=4)))が反映されただけで、以下コードのテキストだけの抽出が出てないので、考えます。 こちらは、 get_fullTextAnnotation がそのままの記述ではエラーになることも確認しています。まああとはJSONデータから特定の部分を抜き出すコードを書けばいいだけなので、そう難しくなく到達できると思います。
Tsuyoshi777

2019/07/02 19:06

わかりました。ありがとうございます。調べてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問