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

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

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

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

2331閲覧

CloudVision apiで得られた認識結果から座標値を取り出したい

ookura

総合スコア27

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/11/29 02:42

json型で返された結果から読み取り座標値を読み取って対象の画像に四角いマーキングを
したいと思っているのですが座標値の取り方がいまいちわかりません。

不勉強で申し訳ありませんがどなたかご教示いただけますと幸いです。
下記コードとなります。

python

1import requests 2import base64 3import json 4 5GOOGLE_CLOUD_VISION_API_URL = 'https://vision.googleapis.com/v1/images:annotate?key=' 6API_KEY = 'AIzaSyA5HPWqOkSZf0AAj9N7Ndg584huXVIy8yc' # 取得したAPIキーを入力してください。 7 8# APIを呼び、認識結果をjson型で返す 9def request_cloud_vison_api(image_base64): 10 api_url = GOOGLE_CLOUD_VISION_API_URL + API_KEY 11 req_body = json.dumps({ 12 'requests': [{ 13 'image': { 14 'content': image_base64.decode('utf-8') # jsonに変換するためにstring型に変換する 15 }, 16 'features': [{ 17 'type': 'DOCUMENT_TEXT_DETECTION', # ここを変更することで分析内容を変更できる 18 'maxResults': 10, 19 }] 20 }] 21 }) 22 res = requests.post(api_url, data=req_body) 23 return res.json() 24 25# 画像読み込み 26def img_to_base64(filepath): 27 with open(filepath, 'rb') as img: 28 img_byte = img.read() 29 return base64.b64encode(img_byte) 30 31# 文字認識させたい画像を./img.pngとする 32img_base64 = img_to_base64(r"C:\Users\straw\Desktop\AOCR\OCR\base\ベース20201120.jpg") 33result = request_cloud_vison_api(img_base64) 34 35#認識した文字の位置など、すべての情報を出力 36#print("{}".format(json.dumps(result, indent=4))) 37 38#認識した文字のみを出力 39text_r = result["responses"][0]["fullTextAnnotation"]["text"] 40for text in text_r: 41 temp2 = [ 42 result["responses"][0]["fullTextAnnotation"]["text"], 43 #座標1の取得 44 #座標2の取得 45 ] 46 print(result["responses"][0]["fullTextAnnotation"]["text"]) 47 48 49 50

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

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

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

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

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

guest

回答1

0

ベストアンサー

symbols内のboundingBoxの座標値を取得すればよいかと思います。
参考:AnnotateImageResponse

Python

1import json 2from PIL import Image, ImageDraw 3 4# https://cloud.google.com/vision/docs/images/sign_small.jpg 5img = Image.open('sign_small.jpg') 6draw = ImageDraw.Draw(img) 7 8# response 9with open('res.json') as f: 10 res = json.load(f) 11 12res = res['responses'][0]['fullTextAnnotation'] 13#text = res['text'] 14pages = res['pages'] 15for page in pages: 16 blocks = page['blocks'] 17 for block in blocks: 18 paras = block['paragraphs'] 19 for para in paras: 20 words = para['words'] 21 for word in words: 22 symbols = word['symbols'] 23 for symbol in symbols: 24 print('-----') 25 print(symbol['text']) 26 vs = symbol['boundingBox']['vertices'] 27 ps = [] 28 for v in vs: 29 x, y = v['x'], v['y'] 30 ps.append((x,y)) 31 print(x,y) 32 draw.polygon(ps, outline=(255,0,0)) 33 34 35img.save('ret.png')

Request body

json

1{ 2 "requests": [ 3 { 4 "image": { 5 "source": { 6 "imageUri": "https://cloud.google.com/vision/docs/images/sign_small.jpg" 7 } 8 }, 9 "features": [ 10 { 11 "type": "DOCUMENT_TEXT_DETECTION" 12 } 13 ] 14 } 15 ] 16}

元画像が小さいためか、YOUR ENGINEあたりの矩形がちょっとあやしいですが。
イメージ説明

投稿2020/11/29 04:17

編集2020/11/29 04:22
can110

総合スコア38262

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

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

ookura

2020/11/29 11:01

ご回答ありがとうございます。 座標値の抜きだしができました。 しかし、抜き出した座標値が単語ブロックごとではなく1文字毎になってしまうのですが、 (DOCUMENT_TEXT_DETECTIONで設定しているのにかかわらず) 単語ブロック毎に単語と座標値を抜き出すには、 抜き出した内容を連結するのが常套手段でしょうか? または、そのまま単語ブロックでその座標値を抜き出す方法があるのでしょうか。 お手数ですが合わせてご教示いただけますと幸いです。
can110

2020/11/29 11:05

「単語ブロック」がレスポンス内のどれを指すのかが分かりませんので何とも言えません。 参考URLにレスポンスの詳細がありますので、その中から該当しそうな座標値をご自身で探してみてください。
ookura

2020/11/29 13:12

申し訳ありません。参考URLで調べてみたのですがよくわからなく、できれば再度ご教示ください。 TextAnnotationのFieldsの内のtextを取得した場合、(コード中のresult["responses"][0]["fullTextAnnotation"]["text"]の部分)であれば、例えば,掲載いただいたsign_small.jpgのWAITING?の部分が1文字ずつではなく単語で取得ができました。 単語で取得した際の座標値を取得したかったのですが、ご教示いただいたコード、参考URL内の内容を見ると1文字ずつの座標値の取得でしたのでよい方法はないかなと思っています。 何度も申し訳ありませんがご教示いただけますと幸いです。
ookura

2020/11/29 15:02

自己解決しました。 fullTextAnnotationではなくtextAnnotationsから探っていくと単語単位とその座標値が取れました ご丁寧にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問