metrics op• Data kinds: points × points → signal
• Call: import fullseye as fs; fs.ledger.m3c2_distance(a, b, cores, normals, radius, max_depth=None, min_points=4) (implementation को सीधे call करना हो तो import metrics3d; metrics3d.m3c2_distance(a, b, cores, normals, radius, max_depth=None, min_points=4), registry से लेना हो तो ops3d.get("m3c2_distance"))
• Ledger के ज़रिए return value: fullseye.ledger.m3c2_distance(...) केवल घोषित out type signal का value लौटाता है (मूल function सहायक जानकारी भी लौटाता है)। जो हिस्सा छोड़ दिया गया है उसकी ज़रूरत हो तो fullseye.ledger.m3c2_distance.raw(...) का उपयोग करें, या metrics3d.m3c2_distance को सीधे call करें।
2 समयों के point clouds का अंतर normal direction में मापता है (M3C2)। → (distance, lod) के 2 मान।
nearest neighbour दूरी (chamfer / C2C) "सबसे नज़दीकी point तक की दूरी" है, इसलिए झुकी हुई surface पर surface के साथ-साथ हुए खिसकाव को भी दूरी गिन लेती है। terrain और संरचनाओं के बदलाव का पता लगाने में यही "केवल दोबारा मापने से पकड़ा गया झूठा बदलाव" का मुख्य कारण बनता है (poc_structure_4d_deterioration का मापन: शून्य गिरावट के साथ केवल दोबारा मापने पर C2C का median 21.07 mm, normal की दिशा में 0.55 mm)।
M3C2 (Lague 2013) हर core point पर normal n को अक्ष मानने वाले cylinder (radius radius, लंबाई max_depth) से दोनों clouds को काटता है, और हर point को n पर project करके mean का अंतर लौटाता है। दिशा में n जिस तरफ़ इशारा करता है वह धनात्मक है — चिह्न सीधे "बढ़ा / घटा" बताता है।
Args:
a: समय 1 का point cloud (Na,3)।
b: समय 2 का point cloud (Nb,3)।
cores: मापने की जगहें (M,3) (a का subset हो सकता है, या अलग से रखा गया grid भी)।
normals: हर core का normal (M,3) (normalise न हो तो भी चलेगा। इसका चिह्न परिणाम का चिह्न तय करता है)।
radius: cylinder का radius (core के आसपास mean लेने का दायरा। surface की roughness से बड़ा, और मापी जाने वाली
संरचना से छोटा रखें)।
max_depth: cylinder की लंबाई का आधा। None हो तो अक्ष की दिशा में कोई सीमा नहीं।
min_points: जिस core में किसी एक तरफ़ इतने points न हों वह nan लौटाता है (default 4)।
Returns:
(distance, lod): दोनों (M,) float64। distance normal की दिशा में
signed अंतर है, lod (level of detection)
1.96·sqrt(σa²/na + σb²/nb) है — इस मान से अधिक न होने वाले अंतर को noise से अलग नहीं किया जा सकता।
कम points वाले core के लिए दोनों nan।
★ledger के माध्यम से (fullseye.ledger.m3c2_distance) केवल घोषित out type distance
लौटाया जाता है। lod भी चाहिए तो fullseye.ledger.m3c2_distance.raw(...)।
Raises:
ValueError: जब point cloud / cores (N,3) न हों, खाली हों, normals की संख्या cores से
मेल न खाए, radius <= 0, max_depth <= 0, या min_points < 1 हो।
सीमाएँ (honest): (1) normals caller देता है — estimate_point_normals का default चिह्न centroid पर आधारित होता है, इसलिए viewpoint या orient_normals से दिशा एक जैसी न की जाए तो चिह्न जगह-जगह उलट जाता है। (2) lod केवल noise को देखता है, और registration का residual शामिल नहीं करता (Lague का मूल paper registration error को अलग पद के रूप में जोड़ता है)।
(3) जिन किनारों पर cylinder में कम points आते हैं वहाँ nan होता है — 0 लौटाकर उसे "कोई बदलाव नहीं"
जैसा नहीं दिखाता।
Reference (public): D. Lague, N. Brodu, J. Leroux, "Accurate 3D comparison of complex topography with terrestrial laser scanner: application to the Rangitikei canyon (N-Z)", ISPRS Journal of Photogrammetry and Remote Sensing 82 (2013) 10-26.
• blender_interop — Blender के साथ उपयोग — shape बनाएँ, fullseye से मापें (सावधानियाँ: axes, units, ground truth)
• measurement_uncertainty — Measurement uncertainty और calibration — 'हम माप रहे हैं' कहने के लिए क्या चाहिए
• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।
• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।
• metrics_eval — py -3.11 examples_3d/metrics_eval.py
signal को input के रूप में लेते हैं)metrics)chamfer_distance · hausdorff_distance · fscore · rmse_correspondence · normal_consistency · voxel_iou · pose_error
*Provenance: metrics3d.py — 3D operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.