estimate_point_normals — 3D transform op

• Data kinds: points → normals

• Call: import fullseye as fs; fs.ledger.estimate_point_normals(points, k=16, viewpoint=None) (implementation को सीधे call करना हो तो import match3d; match3d.estimate_point_normals(points, k=16, viewpoint=None), registry से लेना हो तो ops3d.get("estimate_point_normals"))

उपयोग

point cloud (N,3) → unit normals (local k-neighbourhood covariance का सबसे छोटा eigenvector = PCA)।

FPFH/SHOT/point-to-plane ICP को जिन normals की ज़रूरत है, उन्हें raw point cloud से बनाता है। दिशा के 2 नियम हैं:

viewpoint=None (default) = centroid से बाहर की ओर (बंद object के चारों ओर वाले point cloud के लिए) / viewpoint दिया हो = viewpoint (sensor) की ओर (Hoppe 1992 / PCL नियम। Single-viewpoint scan की दिखने वाली surface का sensor की ओर होना physically सही है। pointcloud.estimate_normals वाला ही नियम)। पुराना version (2026-08-30 तक) viewpoint देने पर भी "viewpoint से दूर" वाला sign लेता था, इसलिए single-viewpoint scan वाले असली उपयोग में सभी points उल्टे हो जाते थे। Return value normals (N,3)।

प्रक्रिया: cKDTree से हर point के k neighbour लिए जाते हैं (point ख़ुद शामिल; k > N हो तो N तक सीमित), और उनके covariance का सबसे छोटा eigenvector normal बनता है। Return value (N,3) float64 unit vectors। viewpoint 3 dimension का coordinate है (sensor की position)। Neighbour की संख्या min(k, N) 3 से कम हो (केवल 1-2 points, या k < 3) तो ValueError —— 3 से कम points से plane तय नहीं होता (1 point से covariance भी नहीं बनता; 2026-10-07 तक यह einsum की internal error से crash होता था)। Neighbourhood एक ही सीधी रेखा पर हो तो normal अनिश्चित ही लौटता है (कोई जाँच नहीं)। k छोटा हो तो noise का असर ज़्यादा, बड़ा हो तो corners गोल हो जाते हैं।

आगे: icp_point2plane का dst_normals, render_shaded के लिए normals, normals_to_egi। pointcloud.estimate_normals (ledger estimate_normals) वाला ही नियम।

संदर्भ (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 करते हैं)

• fpfh_correspondence — py -3.11 examples_3d/fpfh_correspondence.py

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

icp_point2plane · compute_fpfh · shot_descriptor · fuse_to_voxel · reflect · refract · normal_consistency · ransac_cylinder

इसी category के (transform)

points_to_voxel · gaussians_to_voxel · mesh_to_voxel · mesh_to_points · depth_to_points · voxel_to_mips · voxel_to_mesh · tsdf_from_depth


*Provenance: match3d.py — 3D operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.