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
パタン画像
サーチ対象画像
結果画像