【python】cloud vision api から返ってきたjsonデータをソートしてから使いたい
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 1,006
前提・実現したいこと
cloud vision apiを用いてテキスト検出をしています。
その際、各テキストボックスのx座標最大値から降順でjsonデータとして格納されているのですが、これを
x座標の最大値から降順、y座標は0からにして
画像の右上から左下に向かってテキスト検出をさせたい
該当のソースコード
↓↓↓返って来るjsonデータ↓↓↓
{
"property": {
"detectedLanguages": [
{
"languageCode": "ja"
}
]
},
"boundingBox": {
"vertices": [
{
"x": 35,
"y": 201
},
{
"x": 47,
"y": 201
},
{
"x": 47,
"y": 206
},
{
"x": 35,
"y": 206
}
]
},
"text": "\u308b",
"confidence": 0.99
},
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': 'DOCUMENT_TEXT_DETECTION', # ここを変更することで分析内容を変更できる
'maxResults': 10,
}]
}]
})
res = requests.post(api_url, data=req_body)
return res.json()
# 画像読み込み
def img_to_base64(filepath):
with open(filepath, 'rb') as img:
img_byte = img.read()
return base64.b64encode(img_byte)
# 文字認識させたい画像を./img.pngとする
img_base64 = img_to_base64('images/konan.jpg')
result = request_cloud_vison_api(img_base64)
i = 0;
for rect in result["responses"][0]["textAnnotations"]:
x1 = rect["boundingPoly"]["vertices"][0]["x"]
y1 = rect["boundingPoly"]["vertices"][0]["y"]
x2 = rect["boundingPoly"]["vertices"][1]["x"]
y2 = rect["boundingPoly"]["vertices"][2]["y"]
print(result["responses"][0]["textAnnotations"][i]["boundingPoly"])
print(result["responses"][0]["textAnnotations"][i]["description"])
//検出したテキストboxの四つ角の座標(0番目のx座標、降順になっている。)
//検出した文字
{'vertices': [{'x': 604, 'y': 363}, {'x': 617, 'y': 363}, {'x': 617, 'y': 411}, {'x': 604, 'y': 411}]}
引っ越しまん
{'vertices': [{'x': 603, 'y': 50}, {'x': 616, 'y': 50}, {'x': 616, 'y': 65}, {'x': 603, 'y': 65}]}
から
{'vertices': [{'x': 594, 'y': 35}, {'x': 604, 'y': 35}, {'x': 606, 'y': 86}, {'x': 596, 'y': 86}]}
トラックの上に
{'vertices': [{'x': 583, 'y': 36}, {'x': 593, 'y': 36}, {'x': 592, 'y': 71}, {'x': 582, 'y': 71}]}
売ってたん
{'vertices': [{'x': 592, 'y': 361}, {'x': 600, 'y': 360}, {'x': 600, 'y': 361}, {'x': 592, 'y': 362}]}
「
{'vertices': [{'x': 592, 'y': 371}, {'x': 601, 'y': 370}, {'x': 603, 'y': 398}, {'x': 594, 'y': 399}]}
ってたよ
{'vertices': [{'x': 595, 'y': 402}, {'x': 603, 'y': 401}, {'x': 603, 'y': 402}, {'x': 595, 'y': 403}]}
!
{'vertices': [{'x': 578, 'y': 249}, {'x': 589, 'y': 249}, {'x': 589, 'y': 278}, {'x': 578, 'y': 278}]}
そのに
補足情報(FW/ツールのバージョンなど)
python3.6.5
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
画像の右上から左下に向かってテキスト検出をさせたい
矩形の右上の座標を対象として、yの昇順→xの降順でデータを並び替えればよいかと思います。
from PIL import Image, ImageDraw
import random
# テストデータ。ランダムな順番
dat = [ {'text':'a', 'rect':[{'x': 50,'y': 50},{'x':150,'y': 50},{'x':150,'y':150},{'x': 50,'y':150}]},
{'text':'b', 'rect':[{'x':200,'y': 50},{'x':400,'y': 50},{'x':400,'y':150},{'x':200,'y':150}]},
{'text':'c', 'rect':[{'x':450,'y': 50},{'x':600,'y': 50},{'x':600,'y':150},{'x':450,'y':150}]},
{'text':'d', 'rect':[{'x': 50,'y':200},{'x':300,'y':200},{'x':300,'y':300},{'x': 50,'y':300}]},
{'text':'e', 'rect':[{'x':350,'y':200},{'x':600,'y':200},{'x':600,'y':300},{'x':350,'y':300}]}]
random.shuffle(dat)
# テストデータの描画
im = Image.new('RGB', (640, 480), (255, 255, 255))
draw = ImageDraw.Draw(im)
for d in dat:
x1, y1, x2, y2 = d['rect'][0]['x'], d['rect'][0]['y'], d['rect'][2]['x'], d['rect'][2]['y']
t = d['text']
print(t)
draw.rectangle((x1, y1, x2, y2), outline=(0,0,0))
draw.text((x1+10,y1+10), t, fill=(0,0,0))
im.save('ret.png')
# 矩形の右上の座標を対象として、yの昇順→xの降順で並び替え
print('-----')
dat.sort(key=lambda v:(v['rect'][1]['y'], -v['rect'][1]['x']))
for d in dat:
print(d['text'])
"""
c
b
a
e
d
"""
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.20%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2019/08/25 15:30
解決できました!!