- server: lock globale matcher (race nel threadpool FastAPI), LRU su
_IMG_CACHE e _RECIPE_MATCHERS (leak), clamp ROI in tutti gli endpoint
(400/422 invece di crash 500, check train senza varianti),
filtro_fp=off disabilita davvero il verify NCC, fallback FILTRO_FP_MAP
= medio, verify_threshold ricetta allineato a 0.4, _draw_matches su
crop locale (era warp+Sobel full-frame per ogni match), spread_radius
default 5->4
- gui: centro overlay edge (W-1)/2 -> W/2 (coerenza col train),
spread_radius 5->4
- matcher legacy: _angle_list include estremo, cap candidati top-level,
save/load persiste template_gray
- auto_tune: ref centrato fuori dal loop angoli
- test_suite: check imread con errore chiaro
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- max_vars_full = max(max_matches*8, n_variants // 2): protegge perf con
molte scale mantenendo metà delle varianti al full-res (vs intero senza cap
che dava 22s su 864 varianti, vs 80s screenshot utente)
- Dialog tkinter: resizable, minsize 360x420, Entry col peso 2 espandibile
- Finestra risultati cv2: WINDOW_NORMAL con resizeWindow iniziale 1600x900
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Problema: matcher linemod con solo orientamento gradient può dare score alto
su texture dense/rumore che per caso accumulano orientamenti compatibili.
Esempio: template ruota dentata su scena clip → match a score 0.9 (errati).
Fix in 2 livelli:
1. Background score LOCALE nel find()
- _bg_map(resp, box_size) = densità media bin attivi in bbox template
- Rinormalizza score: s' = max(0, (s - bg) / (1 - bg))
- Annulla contributo di zone sature ma preserva pattern puliti
2. Verify NCC post-hoc
- _verify_ncc(): warpa template alla pose (cx, cy, angle, scale) e
calcola NCC classico su intensità con la scena sottostante
- Threshold di default 0.4 elimina FP con edge orientati casualmente
- Parametro esposto in GUI (verify_threshold)
Rimossa penalty di saturazione nel response_map (ridondante).
Test regression (ruote dentate vs clip, clip vs ruote dentate):
no verify: 12+ falsi positivi con score ~0.7
verify 0.4: 1-2 falsi positivi rimanenti, true positive invariati
verify 0.5: 0 falsi positivi, 1 TP scale piccola perso
Benchmark clip→clip (13 istanze):
full pipeline (Numba + threads + refine + subpix + verify): 1.12s
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>