refine op• Data kinds: points × points → pose
• Call: import fullseye as fs; fs.ledger.icp_point2point_3d(src, dst, iters=50, init_R=None, init_t=None, tol=1e-06, max_corr_dist=None, trim_ratio=None, device='cpu', reproducible=False) (to call the implementation directly, import match3d; match3d.icp_point2point_3d(src, dst, iters=50, init_R=None, init_t=None, tol=1e-06, max_corr_dist=None, trim_ratio=None, device='cpu', reproducible=False); from the registry, ops3d.get("icp_point2point_3d"))
Refine point sets by point-to-point ICP (Kabsch/SVD).
Starting from the initial pose (init_R, init_t) obtained by a coarse match estimate (integer NCC / Fourier-Mellin±3° / Hough±0.5voxel), it aligns the src point cloud to the dst point cloud by a rigid-body transform. In each iteration it rebuilds the nearest-neighbour correspondences (cKDTree), obtains the relative rotation and translation with the Kabsch algorithm (SVD) and accumulates them, so it converges to sub-voxel accuracy even when the correspondences are not known.
Partial overlap and outliers are handled by Trimmed ICP (only correspondences with small distance are used) and an absolute distance gate (max_corr_dist). The final RMSE is evaluated on the correspondences actually used (inliers), so it reflects the pose quality correctly even for partial observations.
Arguments:
src: (N,3) moving point cloud (torch.Tensor or numpy.ndarray).
dst: (M,3) fixed (reference) point cloud.
iters: maximum number of iterations.
init_R: (3,3) initial rotation. None means the identity matrix.
init_t: (3,) initial translation. None means the zero vector.
tol: stops as converged when the relative RMSE improvement falls below this value.
max_corr_dist: correspondences farther than this distance are rejected as outliers (None disables).
trim_ratio: 0<r<=1. Trimmed ICP that in each iteration uses only the top fraction r of correspondences
with the smallest nearest-neighbour distance. Effective for partial overlap (overlap ratio r). None disables.
device: torch device ("cpu" etc.). The SVD is solved on this device.
reproducible: if True, reductions do not depend on the point order or the number of BLAS threads (default False = as before).
The mean uses math.fsum, the cross-covariance H uses ozakimm (Ozaki scheme), the pose is applied element-wise, and the RMSE also uses math.fsum.
Permuting the order of the src points gives bit-identical R, t and rmse (on the same machine, same LAPACK). Points whose distances tie exactly
at the trim_ratio cut-off may be selected differently depending on the order. With 200,000 points, 0.7 ms per 1 iteration becomes about 170 ms.
Returns:
R: (3,3) rotation. Satisfies dst ~= src @ R.T + t. In an environment with torch it is a torch.Tensor, otherwise a numpy.ndarray with the same values (when the body was converted to numpy
on 2026-09-07, the type was kept for compatibility).
★icp_point2plane of the same family always returns numpy — the types within the family
are not consistent, so passing through np.asarray(R) downstream is the safe choice
(either works; this inconsistency is left in place to avoid a breaking change).
t: (3,) translation (same type as R).
info: dict. "rmse" (final RMSE over the used correspondences), "iters" (actual number of iterations),
"converged" (bool), "inliers" (number of used correspondences), "rmse_history" (list).
• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).
• Operator provenance and references — the sources of the research/methods this op family came from.
• gicp_register — py -3.11 examples_3d/gicp_register.py
• itokawa_self_register — py -3.11 examples_3d/itokawa_self_register.py
• itokawa_shape_match — py -3.11 examples_3d/itokawa_shape_match.py
• partial_overlap_icp — py -3.11 examples_3d/partial_overlap_icp.py
pose as 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_point2plane
*Provenance: match3d.py — 3D operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.