feature_register op• Data kinds: points × points → pose
• Call: import fullseye as fs; fs.ledger.register_shot(src, dst, radius=None, normal_k=16, ratio=0.9, ransac_iters=2000, inlier_thr=None, refine_icp=True, max_kp=400, device='cpu', seed=0) (implementation को सीधे call करना हो तो import feat_shot; feat_shot.register_shot(src, dst, radius=None, normal_k=16, ratio=0.9, ransac_iters=2000, inlier_thr=None, refine_icp=True, max_kp=400, device='cpu', seed=0), registry से लेना हो तो ops3d.get("register_shot"))
SHOT descriptor से sparse feature matching + RANSAC rigid pose estimation (पूरी pipeline)।
प्रारंभिक अनुमान के बिना, बड़े rotation और आंशिक overlap वाले 2 point cloud का correspondence बनाकर rigid transform (rotation R + translation t) लौटाता है। dense matching (NCC/Hough/PCA) से अलग, हर ISS keypoint पर local reference frame (LRF) बनाया जाता है, गोलाकार रूप से बँटी cells के normal angle histogram (SHOT) से वर्णन → Lowe ratio test + mutual nearest neighbour से match → RANSAC से outlier के प्रति robust ढंग से pose का अनुमान। प्राप्त pose ICP के coarse प्रारंभिक मान (coarse init) देने में भी उपयोगी है।
LRF की sign अस्पष्टता: distance-weighted covariance के eigenvector का sign तय नहीं होता, इसलिए हर axis (x=सबसे बड़ा, z=सबसे छोटा eigenvalue) को पड़ोसी vector (p_i-p) के projection के बहुमत की ओर मिलाया जाता है (Tombari का sign नियम), और y=z×x से right-handed system बनता है। point normal को भी इसी नियम से पड़ोस के द्रव्यमान से दूर की दिशा (locally बाहर) में एक-सा किया जाता है, इसलिए वे rotation के साथ covariant और आंशिक overlap में भी स्थिर हैं। दोनों point cloud पर एक ही नियम लगाकर descriptor की repeatability सुनिश्चित की जाती है।
Args:
src, dst: (N,3)/(M,3) point cloud (numpy या torch)। src को dst पर align किया जाता है।
radius: SHOT support radius। None हो तो हर point cloud के अपने bbox diagonal (छोटा वाला) का 0.15 गुना
(संयुक्त bbox का diagonal translation से बढ़ जाता है और scale बिगड़ता है, इसलिए उसका उपयोग नहीं होता)।
normal_k: normal estimation का knn संख्या।
ratio: Lowe ratio test का threshold (जितना छोटा, उतना सख्त)।
ransac_iters: RANSAC iterations की संख्या।
inlier_thr: RANSAC inlier distance। None हो तो bbox diagonal का 0.03 गुना।
refine_icp: True हो तो प्राप्त pose को प्रारंभिक मान मानकर Trimmed ICP (icp_point2point_3d) से परिष्कृत करता है।
max_kp: keypoint की ऊपरी सीमा।
device: torch device ("cpu" आदि)। SVD/ICP इसी पर हल होते हैं।
seed: RANSAC का random seed।
Returns:
R: (3,3) numpy। dst ≈ src @ R.T + t को संतुष्ट करने वाला rotation (icp जैसी ही convention)।
t: (3,) numpy। translation।
info: dict। "n_kp_src","n_kp_dst","n_matches","n_inliers","inlier_ratio",
"icp_rmse" (refine_icp होने पर),"ok" (True=अनुमान सफल; 4 से कम inlier को
अविश्वसनीय मानकर False + identity transform लौटाता है)।
• blas_threads_and_memory — Matrix decompositions धीमे क्यों हैं — BLAS threads, caches, memory layout
• 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 के स्रोत।
• feature_register — py -3.11 examples_3d/feature_register.py
pose को input के रूप में लेते हैं)fuse_to_voxel · pose_error · bundle_adjust · mean_reprojection_error · optimize_pose_graph · relative_pose · mean_edge_error · rotation_translation_error
feature_register)harris3d_keypoints · iss_keypoints · compute_fpfh · shot_descriptor · register_spin · register_fpfh
*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.