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

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

ただいまの
回答率

88.58%

Python 辞書型の要素取得に関して

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 524

sirokuma405

score 11

Pythonを使い、画像内のバーコード情報の取得をしようと考えています。

画像内のバーコード情報自体の抽出はできているのですが、要素を取得できません。

取得の仕方を教えていただけないでしょうか

環境としては
Python : 2.7.13
OS : raspbian 9.4
です。

import cv2
import zbar

#image_path = "barcode_original1.jpg"
#image_path = "barcode_original2.jpg"
image_path = "barcode_original3.JPG"

scanner = zbar.ImageScanner()
scanner.parse_config('enable')

im = cv2.imread(image_path)
gray_im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
rows,cols = im.shape[:2]

# convert to gray_scale using threshold
ret, threshold_im = cv2.threshold(gray_im, 150, 255, cv2.THRESH_BINARY)
# get contour by findContours()
im, contours, hierarchy = cv2.findContours(threshold_im, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# get rectangle from contour
# center_pt: rectangle's central coordinates
# w: rectangle's width, h: height
# angle: rectangle's anlge
scanned_data = {}
for contour in contours:
    rect = cv2.minAreaRect(contour)
    w = int(rect[1][0])
    h = int(rect[1][1])
    min_w = cols*0.1
    min_h = rows*0.1
    if w > min_w and h > min_h:
        w_half = int(w*0.5)
        h_half = int(h*0.5)
        center_pt = (int(rect[0][0]), int(rect[0][1]))
        top = center_pt[1] - h_half
        right = center_pt[0] + w_half
        bottom = center_pt[1] + h_half
        left = center_pt[0] - w_half
        angle = int(rect[2])
        M = cv2.getRotationMatrix2D(center_pt, angle, 1)
        rotated_im = cv2.warpAffine(im.copy(), M, (cols,rows))
        zbar_image = zbar.Image(cols, rows, 'Y800', rotated_im.tostring())
        scanner.scan(zbar_image)
        for symbol in zbar_image:
            symbol_type = symbol.type
            symbol_data = symbol.data
            if(symbol_type not in scanned_data.keys()):
                scanned_data[symbol_type] = []
                if symbol_data not in scanned_data[symbol_type]:
                    scanned_data[symbol_type].append(symbol_data)
        del(zbar_image)

# ここまでバーコード情報の取得

print type(scanned_data)
print scanned_data
print scanned_data["ISBN10"]
<type 'dict'>
{'ISBN10': ['4797374772'], 'EAN13': ['1920055026000']}
Traceback (most recent call last):
  File "barcode_recognize2.py", line 62, in <module>
    print scanned_data["ISBN10"]
KeyError: 'ISBN10'

追記

for key,val in scanned_data.items():
    print "key : "+str(key)+" val : "+str(val)
    print type(key)
    print scanned_data[key]


のコードを追記したところ

key : ISBN10 val : ['4797374772']
<type 'zbar.EnumItem'>
['4797374772']
key : EAN13 val : ['1920055026000']
<type 'zbar.EnumItem'>
['1920055026000']


となりました。
keyがstrだと思いこんでいたのが原因かもしれないです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • can110

    2018/11/03 15:38

    問題ないですね。ターミナル上で「python -V」実行で表示される結果のpythonバージョンも追記ください。

    キャンセル

  • sirokuma405

    2018/11/03 15:39

    Python 2.7.13 です

    キャンセル

  • can110

    2018/11/03 15:42

    追記ありがとうございます。バージョンも問題ないですねぇ。回答に当方のテストコード記載しましたのでエラー発生するか試してみてください。

    キャンセル

回答 2

check解決した方法

+1

”追記”の箇所に記述しましたが、keyがsrtと思っていたのが原因でした。

要素の追記を行う際にkeyをstrにキャストすることで解決できました。

        for symbol in zbar_image:
            symbol_type = str(symbol.type)
            symbol_data = symbol.data


とすることで正常にどうさするようになりました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

以下の単純コードを実行してみてください。同様にKeyErrorは発生しますか?

scanned_data = {'ISBN10': ['4797374772'], 'EAN13': ['1920055026000']}
print type(scanned_data)
print scanned_data
print scanned_data["ISBN10"]
print scanned_data.keys()

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/03 15:46

    出ずに、正常に動きます・・・

    キャンセル

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

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

関連した質問

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