FPM(特徴点応用マッチング)


FPMサーチを行い、サーチ結果を画像として保存するサンプルコードです。 Matplotlib を使用します。

import pyfie
import matplotlib.pyplot as plt

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

# 入力画像読み込み
hpat = pyfie.imread("fpm_pattern.png")
htar = pyfie.imread("fpm_target.png")

# マッチングパラメータ設定
max_results = 5
fpm_param = pyfie.F_FPM_MATCH(
    require_result_num=max_results,
    min_angle=-30,
    max_angle=30,
    min_scale=80,
    max_scale=120,
    coarse_comp_rate=3,
    coarse_err_wide=1,
    coarse_highcomp_threshold=60,
    coarse_lowcomp_threshold=60,
    refine_execute=True,
    refine_threshold=70,
    refine_err_wide=1,
    polarity=pyfie.F_FPM_SAME_POLARITY
)
matching_mode = pyfie.F_FPM_NORMAL_MODE

# 相関エッジパラメータ設定
edge_method = pyfie.F_FPM_CORR_EDGE
edge_param = pyfie.F_FPM_FEATURE(
    corr_edge=pyfie.F_EDGE_CORR_PARAMS(
        width=13,
        height=5,
        var_threshold=9.0,
        sigmoid_k=1.0,
        mag_threshold=160,
        nms_length=6,
    )
)

# 回答オフセットとサーチウインドウを設定
offset = pyfie.DPNT_T(hpat.width / 2, hpat.height / 2)
win = pyfie.BOX_T((0, 0), (htar.width - 1, htar.height - 1))

# データ受け取りのための PyFIE データ型インスタンスを作成
results = pyfie.F_SEARCH_RESULT.ARRAY(max_results)
nresults = pyfie.INT()

# FPMオブジェクトを確保
hfpm = pyfie.fnFIE_fpm_alloc(
    hpat, None, offset, matching_mode, edge_method, edge_param, None
)
assert hfpm is not None

# サーチ実行
pyfie.fnFIE_fpm_matching(
    hfpm, htar, None, win, edge_method, edge_param, fpm_param, None, results, nresults
)

# サーチ結果を表示
print("num results:", nresults)
for i in range(nresults):
    result = results[i]
    print("#{}: x = {:.2f}, y = {:.2f}, angle = {:.2f}, scale = {:.2f}, score = {}".format(
        i, result.x, result.y, result.q, result.s, result.score
    ))

# 結果をプロットしてファイルに保存
htar.imshow()
pyfie.mpltools.plot_fpm_results(hfpm, results)
plt.savefig("fpm_result.png")

処理結果例

$ python sample_fpm.py
num results: 3
#0: x = 363.40, y = 362.60, angle = 5.02, scale = 100.41, score = 99
#1: x = 159.68, y = 183.40, angle = -11.35, scale = 99.56, score = 98
#2: x = 129.60, y = 366.08, angle = -10.47, scale = 82.10, score = 94

パタン画像

../../_images/fpm_pattern.png

サーチ対象画像

../../_images/fpm_target.png

結果画像

../../_images/fpm_result.png

ダウンロード