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

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

ただいまの
回答率

88.20%

【python】cloud vision api から返ってきたjsonデータをソートしてから使いたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,006

purinn

score 4

前提・実現したいこと

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

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
"""


イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/25 15:30

    ありがとうございます!

    解決できました!!

    キャンセル

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

  • ただいまの回答率 88.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る