Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d335f866a3 | |||
| 88f80a2cad | |||
| d52d0d0489 | |||
| 9451a418a6 | |||
| 2c9160e4be |
+11
-4
@@ -954,7 +954,7 @@ class LineShapeMatcher:
|
|||||||
# variante e' quantizzato a multipli di angle_step (5 deg default).
|
# variante e' quantizzato a multipli di angle_step (5 deg default).
|
||||||
# Refine angolare e' essenziale per orientamento sub-step.
|
# Refine angolare e' essenziale per orientamento sub-step.
|
||||||
if search_radius is None:
|
if search_radius is None:
|
||||||
search_radius = self._effective_angle_step() / 2.0
|
search_radius = self._effective_angle_step()
|
||||||
|
|
||||||
h, w = template_gray.shape
|
h, w = template_gray.shape
|
||||||
sw = max(16, int(round(w * scale)))
|
sw = max(16, int(round(w * scale)))
|
||||||
@@ -1042,8 +1042,12 @@ class LineShapeMatcher:
|
|||||||
# Score all'origine come riferimento (ang offset 0)
|
# Score all'origine come riferimento (ang offset 0)
|
||||||
s0, cx0_s, cy0_s = _score_at_angle(0.0)
|
s0, cx0_s, cy0_s = _score_at_angle(0.0)
|
||||||
best = (angle_deg, s0, cx0_s, cy0_s)
|
best = (angle_deg, s0, cx0_s, cy0_s)
|
||||||
tol = 0.1 # gradi
|
# Precisione angolare: 10 iter golden con tol 0.05 deg.
|
||||||
for _ in range(8):
|
# Compromesso speed/accuracy: il parabolic fit aggiuntivo era
|
||||||
|
# instabile su score map non-smooth (template simmetrici producono
|
||||||
|
# multipli local max ravvicinati che lo facevano divergere).
|
||||||
|
tol = 0.05
|
||||||
|
for _ in range(10):
|
||||||
if s1 > best[1]:
|
if s1 > best[1]:
|
||||||
best = (angle_deg + x1, s1, cx1, cy1)
|
best = (angle_deg + x1, s1, cx1, cy1)
|
||||||
if s2 > best[1]:
|
if s2 > best[1]:
|
||||||
@@ -1825,7 +1829,10 @@ class LineShapeMatcher:
|
|||||||
ang_f, score_f, cx_f, cy_f = self._refine_angle(
|
ang_f, score_f, cx_f, cy_f = self._refine_angle(
|
||||||
spread0, bit_active_full, self.template_gray, cx_f, cy_f,
|
spread0, bit_active_full, self.template_gray, cx_f, cy_f,
|
||||||
var.angle_deg, var.scale, mask_full,
|
var.angle_deg, var.scale, mask_full,
|
||||||
search_radius=self._effective_angle_step() / 2.0,
|
# Search radius esteso allo step pieno (era step/2):
|
||||||
|
# copre il caso peggiore in cui il picco vero e' all'estremo
|
||||||
|
# del bin angolare della variante grezza.
|
||||||
|
search_radius=self._effective_angle_step(),
|
||||||
original_score=score,
|
original_score=score,
|
||||||
)
|
)
|
||||||
# Halcon SubPixel='least_squares_high': refinement iterativo
|
# Halcon SubPixel='least_squares_high': refinement iterativo
|
||||||
|
|||||||
+3
-1
@@ -194,7 +194,9 @@ def _draw_matches(scene: np.ndarray, matches: list[Match],
|
|||||||
edge_mask = edge_mask & (warped_mask > 0)
|
edge_mask = edge_mask & (warped_mask > 0)
|
||||||
if edge_mask.any():
|
if edge_mask.any():
|
||||||
edge_overlay = np.zeros_like(out)
|
edge_overlay = np.zeros_like(out)
|
||||||
edge_overlay[edge_mask] = (0, 220, 0) # verde brillante
|
# Ciano (cambiato da verde): non collide col verde dell'asse
|
||||||
|
# Y dell'UCS che altrimenti scompariva nell'overlay edge.
|
||||||
|
edge_overlay[edge_mask] = (255, 200, 0) # ciano (BGR)
|
||||||
out = cv2.addWeighted(out, 1.0, edge_overlay, 0.6, 0)
|
out = cv2.addWeighted(out, 1.0, edge_overlay, 0.6, 0)
|
||||||
L = max(20, int(L_base * m.scale))
|
L = max(20, int(L_base * m.scale))
|
||||||
# X axis = rotazione di (1, 0) con cv2 matrix → (cos, -sin)
|
# X axis = rotazione di (1, 0) con cv2 matrix → (cos, -sin)
|
||||||
|
|||||||
@@ -102,8 +102,8 @@
|
|||||||
<div class="field">
|
<div class="field">
|
||||||
<label>Simmetria</label>
|
<label>Simmetria</label>
|
||||||
<select id="p-simmetria">
|
<select id="p-simmetria">
|
||||||
|
<option value="nessuna" selected>Nessuna (0..360°)</option>
|
||||||
<option value="invariante">Invariante (cerchi — no rotazione)</option>
|
<option value="invariante">Invariante (cerchi — no rotazione)</option>
|
||||||
<option value="nessuna">Nessuna (0..360°)</option>
|
|
||||||
<option value="bilaterale">Bilaterale (speculare 180°)</option>
|
<option value="bilaterale">Bilaterale (speculare 180°)</option>
|
||||||
<option value="rot_3">Rotazionale 3× (120°)</option>
|
<option value="rot_3">Rotazionale 3× (120°)</option>
|
||||||
<option value="rot_4">Rotazionale 4× (90°)</option>
|
<option value="rot_4">Rotazionale 4× (90°)</option>
|
||||||
|
|||||||
Reference in New Issue
Block a user