metrics op• Datenarten: points × normals → measurement
• Aufruf: import fullseye as fs; fs.ledger.normal_consistency(points_a, normals_a, points_b, normals_b) (die Implementierung direkt: import metrics3d; metrics3d.normal_consistency(points_a, normals_a, points_b, normals_b); aus dem Register: ops3d.get("normal_consistency"))
Normalenübereinstimmung über Nächste-Nachbar-Korrespondenzen = mean|cos(na, nb)| (Orientierung ignoriert). → [0,1]. 1 = perfekte Übereinstimmung.
Raises ValueError: wenn eine Punktwolke leer oder nicht (N,3) ist bzw. die Normalen den Punkten nicht 1-zu-1 entsprechen.
Berechnung: Für jeden Punkt von points_a den nächsten Nachbarn in points_b (cKDTree, k=1) bestimmen, dessen Normale nb und die eigene Normale na auf Einheitslänge bringen (durch Norm + 1e-12 teilen) und |na · nb| mitteln. Da der Betrag genommen wird, wird eine abweichende Orientierung der Normalen (Vorder-/Rückseite) ignoriert. Asymmetrisch (nur die eine Richtung a → b. Wird die Gegenrichtung benötigt, die Argumente vertauschen und erneut aufrufen).
Argumente: points_a (N, 3), normals_a (N, 3), points_b (M, 3), normals_b (M, 3). Geprüft wird, dass alle 4 nicht leere (*, 3) sind und die Zeilenzahl der Normalen mit der Zeilenzahl der zugehörigen Punktwolke übereinstimmt (Verstöße ergeben ValueError). Eine Nullnormale wird durch 1e-12 geteilt und trägt nahezu 0 bei (kein Fehler).
Rückgabewert: Python float, [0, 1]. 1 = Normalen in allen Korrespondenzen parallel. Bei zufälligen Normalenpaaren liegt der Erwartungswert in 3-D bei etwa 0.5 (Mittelwert des Betrags von cos).
Hinweis: Die räumliche Nähe wird nicht betrachtet (auch bei einem weit entfernten nächsten Nachbarn werden nur die Normalen verglichen). Für eine Bewertung zusammen mit der Position mit chamfer_distance / fscore kombinieren. Für eine Wolke ohne Normalen diese zuerst mit estimate_point_normals (lokale PCA) erzeugen und dann übergeben.
• blender_interop — Zusammen mit Blender — Form bauen, mit fullseye messen (Fallstricke: Achsen, Einheiten, Referenzdaten)
• measurement_uncertainty — Messunsicherheit und Kalibrierung — was nötig ist, um zu behaupten, dass man misst
• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).
• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.
• metrics_eval — py -3.11 examples_3d/metrics_eval.py
measurement als Eingabe)vol_gaussian_psf · fuse_to_voxel · fresnel_reflectance · snell_angle
metrics)chamfer_distance · hausdorff_distance · m3c2_distance · fscore · rmse_correspondence · voxel_iou · pose_error
*Provenance: metrics3d.py — 3D Operator-Registry. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.