データマトリックス認識


二次元コードの一種であるデータマトリックスを認識し、デコード結果を表示するサンプルコードです。

import pyfie
import matplotlib.pyplot as plt

# PyFIE 関数が返すエラーコードに応じて例外を発生させる機能を有効化
pyfie.ctrl.enable_f_err_exception(True)

# 入力画像読み込み
hsrc = pyfie.imread("datamatrix_src.png")

# データマトリックスオブジェクト生成
hdm = pyfie.FHANDLE()
pyfie.fnFIE_dm_alloc_obj(hdm)

# 検出対象シンボルサイズを適宜設定
size_cells_min = 8
size_cells_max = 144
pyfie.fnFIE_dm_set_size_minmax(hdm, size_cells_min, size_cells_max)

# 検出対象シンボルセルサイズを適宜設定
width_cell_min = 3
width_cell_max = 48
pyfie.fnFIE_dm_set_cellwidth_minmax(hdm, width_cell_min, width_cell_max)

# デコード実行
pyfie.fnFIE_dm_execute(hdm, hsrc)

# デコード成功数とインデックス番号の参照
decoded_index = pyfie.INT.PTR()
num_decoded = pyfie.INT()

pyfie.fnFIE_dm_query_decoded(hdm, decoded_index, num_decoded)

# デコード成功数を表示
print("num decoded:", num_decoded)

# デコード結果へアクセス
for i in range(num_decoded):
    # 中心座標取得
    x = pyfie.DOUBLE()
    y = pyfie.DOUBLE()
    pyfie.fnFIE_dm_query_center(hdm, decoded_index[i], x, y)

    # デコードメッセージ取得
    message = pyfie.CHAR.PTR()
    pyfie.fnFIE_dm_query_message(hdm, decoded_index[i], message, None)

    # メッセージをPythonバイト列に変換
    message_byte_str = message.value_as_bytes
    # バイト文字列を通常の文字列にデコード。エンコーディングは ASCII
    message_str = message_byte_str.decode("ascii")

    # 座標とメッセージを表示
    print("result #{}: position: ({:.2f}, {:.2f}), message: {}".format(
        i, x, y, message_str
    ))

# 結果をプロットしてファイルに保存
hsrc.imshow()
pyfie.mpltools.plot_datamatrix_results(hdm)
plt.savefig("datamatrix_result.png")

処理結果例

$ python sample_datamatrix.py
num decoded: 1
result #0: position: (119.85, 122.48), message: FAST http://www.fast-corp.co.jp/

入力画像

../../_images/datamatrix_src.png

結果画像

../../_images/datamatrix_result.png

ダウンロード