shot_descriptor — 3D feature_register op

• Data kinds: points × normals → descriptor

• Call: import fullseye as fs; fs.ledger.shot_descriptor(points, normals, kp_idx, tree, radius, n_azim=8, n_elev=2, n_rad=2, n_cos=11) (implementation को सीधे call करना हो तो import feat_shot; feat_shot.shot_descriptor(points, normals, kp_idx, tree, radius, n_azim=8, n_elev=2, n_rad=2, n_cos=11), registry से लेना हो तो ops3d.get("shot_descriptor"))

उपयोग

SHOT descriptor (Tombari 2010)। हर keypoint पर LRF बनाता है और spherical support लेता है।

support को radial 2 × elevation 2 × azimuth 8 = 32 spatial cells में बाँटकर, हर cell में "LRF z axis और neighbour point normal के बीच cos angle" को quadrilinear interpolation से n_cos=11 bins के histogram में जमा किया जाता है → 32×11=352 dimensions को L2 normalise किया जाता है। (Kp,352) लौटाता है। जिन points का LRF नहीं बन सकता उनके लिए zero vector।

Raises ValueError: जब normals की rows की संख्या points से मेल न खाए (दूसरे point cloud के normals मिलाने पर neighbour index सीमा से बाहर जाकर raw IndexError देता है — compute_fpfh जैसी ही श्रेणी)।

Arguments: points (N,3), normals (N,3) unit normals, kp_idx keypoints के point indices हैं (iss_keypoints का output), tree points से बना scipy.spatial.cKDTree है (caller तैयार करता है), radius support radius है (LRF estimation और neighbours इकट्ठा करने, दोनों में उपयोग)। n_azim, n_elev, n_rad, n_cos बदलने पर dimension n_azim*n_elev*n_rad*n_cos हो जाता है।

प्रक्रिया: LRF distance weight max(radius-d, 0) वाले covariance के eigenvectors (x = सबसे बड़ा, z = सबसे छोटा eigenvalue) को neighbours के बहुमत के sign से मिलाकर right-handed बनाता है। 5 से कम neighbours वाले, या degenerate LRF वाले keypoints zero vector ही रहते हैं (matching की ओर बाहर कर दिए जाते हैं)। हर neighbour point को radius, elevation (arccos(qz/r)/π) और normal cos angle में bin centre 0.5 के आधार पर linear interpolate किया जाता है, azimuth को circle पर wrap करके जमा किया जाता है, और अंत में हर row को L2 normalise किया जाता है। float64 (len(kp_idx), n_azim*n_elev*n_rad*n_cos) (default में 352) लौटाता है। 2 clouds की तुलना करते समय दोनों ओर समान radius और समान normal sign नियम इस्तेमाल करें (normal की दिशा उलटने पर cos angle histogram उलट जाता है)। register_shot इस function को दोनों clouds पर लागू करता है और matching तथा RANSAC तक चलाता है।

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

• blas_threads_and_memory — Matrix decompositions धीमे क्यों हैं — BLAS threads, caches, memory layout

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

• feature_register — py -3.11 examples_3d/feature_register.py

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

fuse_to_voxel · shape_distance

इसी category के (feature_register)

harris3d_keypoints · iss_keypoints · compute_fpfh · register_spin · register_fpfh · register_shot


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

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