icp_point2point_3d — 3D 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"))

• GPU: none (CPU reference implementation only)

Usage

Refine point sets by point-to-point ICP (Kabsch/SVD).

Obtained with coarse match estimation (integer NCC/Fourier-Mellin±3°/Hough±0.5voxel) Starting from the initial pose (init_R, init_t), the src side points are rigidly transformed into the dst side points. Align. At each iteration, the nearest neighbor correspondence (cKDTree) is re-stitched and the Kabsch algorithm By calculating and accumulating relative rotations and translations using (SVD), even if the correspondence is not known, Converge to sub-voxel precision.

For partial overlaps and outliers, use Trimmed ICP (adopt only correspondence with small distances). Deal with this using the absolute distance gate (max_corr_dist). The final RMSE was actually adopted. Since the evaluation is based on correspondence (inliers), posture quality is accurately reflected even in partial observations.

Arguments:

src: (N,3) Moving side point cloud (torch.Tensor or numpy.ndarray).

dst: (M,3) Fixed side (reference) point group.

iters: Maximum number of iterations.

init_R: (3,3) Initial rotation. If None, it is an identity matrix.

init_t: (3,) Initial translation. If None, it is a zero vector.

tol: Convergence is terminated if the relative improvement in RMSE is below this value.

max_corr_dist: Discard correspondences exceeding this distance as outliers (disabled with None).

trim_ratio: 0<r<=1. At each iteration, only the top r correspondences with the smallest nearest neighbor distances

Trimmed ICP to be adopted. Effective for partial overlap (overlap rate r). Disabled with None.

device: The torch device (such as "cpu") to place the return value. SVD is solved using NumPy on the CPU.

reproducible: If True, the reduction will be independent of point order and number of BLAS threads (default False = same as before).

The average is math.fsum, the mutual covariance H is ozakimm (Ozaki scheme), the orientation is calculated element by element, and the RMSE is also math.fsum.

Even if the order of the points in src is changed, R・t・rmse remains the same in bits (same computer, same LAPACK). At trim_ratio break

Points that are exactly the same distance apart may be selected in different order. At 200,000 points, 0.7 ms per repetition becomes about 170 ms.

Return value:

R: (3,3) rotation. dst ~= src @ R.T + t. In an environment with torch torch.Tensor, if not, the same value numpy.ndarray (on 2026-09-07

Even when converting the main body to numpy, the type was left unchanged for compatibility.)

★ icp_point2plane in the same family always returns numpy —— in the family

Since the types are not aligned, it is safe to pass np.asarray(R) downstream.

(Either works. This misalignment is left in place to avoid breaking changes.)

t: (3,) translation (same type as R).

info: dict. "rmse" (final RMSE for recruitment), "iters" (actual number of iterations),

"converged" (bool), "inliers" (number of adoptions), "rmse_history" (list).

References (sample data, literature)

• 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.

Runnable examples (verified samples that actually call this op)

• 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

Ops the type connects to (they accept pose as input)

fuse_to_voxel · pose_error · bundle_adjust · mean_reprojection_error · optimize_pose_graph · relative_pose · mean_edge_error · rotation_translation_error

Same category (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.