ワークが画面内で動いても同じ場所を測るために、テンプレート照合で位置(と 30° 刻みの向き)を出し、そのずれを測定モデルに反映してから当てはめます。照合 → 位置決め → 計測、が型で繋がります。
Find the part with template matching (translation, or rotation in 30° steps), then shift the measurement model by that offset before applying it — so the same feature is measured wherever the part landed.
向く: 据え置きの検査機で、ワークが平行移動(+ 粗い回転)だけする場面。テンプレートに構造があるとき(平坦なテンプレートはスコア 0)。
向かない: ★30° 未満の回転や倍率変化。★繰り返し模様(格子・網点)—— NCC の最大は複数の同じ峰を持ち、スコアだけでは区別できない。★ops.set_match_template は同じスレッドで設定する(未設定なら 0 スコアの配列を返す fail-safe)。
gaussian → ncc_locate → shape_locate → create_metrology_model → add_metrology_object_circle_measure → align_metrology_model → apply_metrology_model
gaussian で雑音を落とし → ncc_locate で [score, row, col](回転が要るなら shape_locate で [score, row, col, angle])→ 基準位置との差 (drow, dcol) を取り → 基準画像で作った create_metrology_model + add_metrology_object_* を align_metrology_model(model, drow, dcol) で移し → apply_metrology_model。測定線 1 本だけなら translate_measure。
縁で位置決めするなら edges_sub_pix → fit_line_contours(向きと交点)。測定線を 1 本だけ動かすなら translate_measure。回転が大きいなら rotate_image / affine_trans_image で画像側を戻してから測る(補間で縁がなまる分は測定に乗る)。
ncc_locate の位置は整数画素(テンプレート中心)。サブピクセルの位置決めが要るなら、その後の計測モデルの当てはめ(apply_metrology_model の params)を位置として使う。shape_locate の回転は 30° 刻み。align_metrology_model は平行移動のみ。傾いたワークは参照形状の法線が実物からずれ、measure_length の外に出る。poc_template_tracking / align-and-stack)。位置決めは px で閉じる。追従させた測定結果を mm にするなら mm_per_px_from_reference → table_px_to_mm(倍率が一定の平面視が前提)。
import fullseye as fs
import ops
import numpy as np
yy, xx = np.mgrid[0:96, 0:96].astype(float)
ref = np.where(np.hypot(yy - 40, xx - 40) < 8, 1.0, 0.2) # 基準画像
img = np.roll(ref, (7, -5), axis=(0, 1)) # 動いたワーク
ops.set_match_template(ref[28:52, 28:52].copy()) # 同じスレッドで設定
try:
score, row, col = fs.apply(img, "ncc_locate", 0.5, 0.5)
finally:
ops.set_match_template(None) # 解除する(スレッドに残すと、後の照合 op が黙ってこの型紙を使う)
drow, dcol = row - 40.0, col - 40.0
model = fs.ledger.create_metrology_model()
fs.ledger.add_metrology_object_circle_measure(model, 40.0, 40.0, 8.0, n=40)
moved = fs.ledger.align_metrology_model(model, drow, dcol)
print(fs.ledger.apply_metrology_model(moved, img)[0]["params"]) # 中心 (47, 35) 付近
ncc_locate / shape_locate(照合)、align_metrology_model / translate_measure(追従)poc_template_tracking、gallery2d_contour_measure、poc_search_sweep_width