refine op• Data kinds: points × points × normals → pose
• Call: import fullseye as fs; fs.ledger.icp_point2plane(src, dst, dst_normals, iters=30, tol=1e-09, init=None, trim=None, device='cpu', reproducible=False) (implementation को सीधे call करना हो तो import match3d; match3d.icp_point2plane(src, dst, dst_normals, iters=30, tol=1e-09, init=None, trim=None, device='cpu', reproducible=False), registry से लेना हो तो ops3d.get("icp_point2plane"))
point-to-plane ICP (Gauss-Newton, small-angle approximation) से rigid transform को उच्च सटीकता से refine करता है।
मोटे match (integer NCC / Fourier-Mellin ±3° / Hough ±0.5voxel) के initial pose को surface point clouds की point-to-plane दूरी minimise करके कसने वाली refinement विधि। हर iteration में src के हर point को dst के nearest neighbour से जोड़ा जाता है और point-to-plane residual r_i = n_i·(R·p_i + t - q_i) को minimise किया जाता है। R को small-angle approximation R ≈ I + [ω]× से linearise करने पर हर correspondence का Jacobian J_i = [p_i×n_i | n_i] होता है (scalar triple product n·(ω×p)=ω·(p×n) से), और constant term b_i = -n_i·(p_i - q_i)। normal equations (JᵀJ)x = Jᵀb को 6×6 के रूप में हल करके increment x=[ω|t] मिलता है, जिसे Rodrigues से वापस rotation में बदलकर जोड़ा जाता है। point-to-plane tangent plane के भीतर फिसलने देता है, इसलिए point-to-point की तुलना में कम iterations में surface पर कसकर converge करता है (Low 2004)।
मापा गया (लहरदार surface N=2025, CPU float64): initial 6°/translation 0.06 से 4 iterations में euclid RMSE 1.7e-16 और rotation error 0° तक वापसी (point-to-point 17 iterations पर RMSE 4e-2 और rotation 1.9° पर अटक जाता है)। initial angle 3-20° होने पर भी 4-5 iterations में machine precision।
Arguments:
src (N,3): हिलाया जाने वाला point cloud (मोटे match के बाद का initial pose)।
dst (M,3): reference point cloud (स्थिर)।
dst_normals (M,3): dst के unit normals (normalised न हों तब भी भीतर normalise होते हैं)।
अज्ञात हों तो pointcloud.estimate_normals(dst) आदि से पहले अनुमान लगाएँ।
iters: iterations की अधिकतम संख्या।
tol: RMSE का बदलाव इस मान से कम होने पर convergence मानकर रुकता है।
init ((R0,t0)): initial pose (मोटे match के R,t दें)। None होने पर identity।
trim (float|None): [0,1) का अनुपात। हर iteration में सबसे बड़े point-to-plane residual वाले ऊपरी हिस्से को हटाने वाला
Trimmed ICP (partial overlap और outliers के प्रति robust)।
device: "cpu"/"cuda" आदि। torch device string (device पर निर्भर नहीं)।
reproducible: True होने पर normal equations के JᵀJ और Jᵀb (N points पर reduction) ozakimm (Ozaki scheme) से निकाले जाते हैं,
point-to-plane residual और pose लागू करना element-wise operations हैं, और RMSE math.fsum से। src points के क्रम और BLAS threads की संख्या से स्वतंत्र
R, t और rmse bit स्तर पर समान रहते हैं। default False पहले जैसा है (J.T @ J)।
Returns:
R (3,3), t (3,), aligned (N,3)=R·src+t, rmse (अपनाए गए points का point-to-plane RMSE),
n_iter (वास्तविक iterations की संख्या)।
• 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 के स्रोत।
• refinement — py -3.11 examples_3d/refinement.py
pose को input के रूप में लेते हैं)fuse_to_voxel · pose_error · bundle_adjust · mean_reprojection_error · optimize_pose_graph · relative_pose · mean_edge_error · rotation_translation_error
refine)refine_peak_newton · refine_translation_lk · refine_lm · refine_rotation_z · icp_point2point_3d
*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.