normal_consistency — 3D metrics op

• Data kinds: points × normals → measurement

• Call: import fullseye as fs; fs.ledger.normal_consistency(points_a, normals_a, points_b, normals_b) (implementation को सीधे call करना हो तो import metrics3d; metrics3d.normal_consistency(points_a, normals_a, points_b, normals_b), registry से लेना हो तो ops3d.get("normal_consistency"))

उपयोग

nearest-neighbour correspondence पर normal agreement = mean|cos(na, nb)| (orientation अनदेखा)। → [0,1]। 1=पूरा मेल।

Raises ValueError: यदि point cloud खाली हो या (N,3) न हो / normals points के साथ 1-से-1 न हों।

गणना: points_a के हर point के लिए points_b में nearest neighbour (cKDTree, k=1) लेकर, उस point के normal nb और अपने normal na को unit बनाकर (norm + 1e-12 से भाग देकर) |na · nb| का mean लिया जाता है। absolute value लेने के कारण normal की दिशा (आगे/पीछे) का बेमेल अनदेखा होता है। असममित (केवल a → b एक दिशा। उलटी दिशा चाहिए तो arguments अदला-बदली करके फिर से call करें)।

arguments: points_a (N, 3), normals_a (N, 3), points_b (M, 3), normals_b (M, 3)। जाँचा जाता है कि चारों (4) खाली न होने वाले (*, 3) हों, और normals की rows की संख्या संगत point cloud की rows की संख्या से मेल खाए (उल्लंघन पर ValueError)। zero normal 1e-12 से भाग होकर लगभग 0 योगदान देता है (error नहीं)।

return value: Python float, [0, 1]। 1 = सभी correspondence में normals समानांतर। random normal जोड़ों के लिए 3-D में अपेक्षित मान लगभग 0.5 होता है (cos के absolute value का mean)।

ध्यान दें: स्थिति की निकटता नहीं देखी जाती (दूर के nearest neighbour के लिए भी केवल normal की तुलना)। स्थिति के साथ मूल्यांकन करना हो तो chamfer_distance / fscore के साथ उपयोग करें। जिस cloud में normals न हों उसके लिए पहले estimate_point_normals (local PCA) से उन्हें बनाकर फिर दें।

पृष्ठभूमि guides (इस op के पीछे की physics और conventions)

• blender_interop — Blender के साथ उपयोग — shape बनाएँ, fullseye से मापें (सावधानियाँ: axes, units, ground truth)

• measurement_uncertainty — Measurement uncertainty और calibration — 'हम माप रहे हैं' कहने के लिए क्या चाहिए

संदर्भ (sample data, साहित्य)

• 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 के स्रोत।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• metrics_eval — py -3.11 examples_3d/metrics_eval.py

वे अगले ops जिनसे type जुड़ता है (measurement को input के रूप में लेते हैं)

vol_gaussian_psf · fuse_to_voxel · fresnel_reflectance · snell_angle

इसी category के (metrics)

chamfer_distance · hausdorff_distance · m3c2_distance · fscore · rmse_correspondence · 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.