icp_point2point_3d — 3D refine op

• 数据种类:points × points → pose

• 调用: 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)(要直接调用实现,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);从台账取用则 ops3d.get("icp_point2point_3d"))

用法

用 point-to-point ICP(Kabsch/SVD)精化点群。

以粗匹配估计(整数NCC / Fourier-Mellin±3° / Hough±0.5voxel)得到的初始位姿 (init_R, init_t) 为起点,通过刚体变换将 src 侧点云配准到 dst 侧点云。每次迭代重新建立最近邻对应(cKDTree),用 Kabsch 算法(SVD)求相对旋转、平移并累积,因此即使对应关系未知, 也能收敛到亚体素精度。

对部分重叠、离群值,用 Trimmed ICP(只采用距离小的对应)和绝对距离门限(max_corr_dist)来处理。最终 RMSE 在实际采用的对应(内点)上评估,因此即使是部分观测也能正确反映位姿质量。

参数:

src: (N,3) 移动侧点云(torch.Tensor 或 numpy.ndarray)。

dst: (M,3) 固定侧(参照)点云。

iters: 最大迭代次数。

init_R: (3,3) 初始旋转。None 时为单位矩阵。

init_t: (3,) 初始平移。None 时为零向量。

tol: RMSE 的相对改善低于此值时判定收敛并终止。

max_corr_dist: 超过此距离的对应作为离群值剔除(None 为禁用)。

trim_ratio: 0<r<=1。每次迭代只采用最近邻距离最小的前 r 比例对应的

Trimmed ICP。对部分重叠(重叠率 r)有效。None 为禁用。

device: torch 设备("cpu" 等)。在该设备上求解 SVD。

reproducible: 为 True 时采用不依赖点的顺序、BLAS 线程数的归约(默认 False = 与以前相同)。

均值用 math.fsum,互协方差 H 用 ozakimm(Ozaki 方案),位姿的应用为逐元素运算,RMSE 也用 math.fsum。

即使打乱 src 点的顺序,R、t、rmse 也按位相同(同一计算机、同一 LAPACK 上)。在 trim_ratio 的分界处

距离恰好相同的点,其选取可能随顺序而变。20 万点时每 1 次迭代由 0.7 ms 变为约 170 ms。

返回值:

R: (3,3) 旋转。满足 dst ~= src @ R.T + t。有 torch 的环境下为 torch.Tensor,否则为相同值的 numpy.ndarray(2026-09-07

将主体改为 numpy 时,为了兼容仍保留了该类型)。

★同一族的 icp_point2plane 始终返回 numpy —— 族内

类型不统一,因此在下游通过 np.asarray(R) 较为安全

(两者都能运行。为避免破坏性变更而保留了这种不统一)。

t: (3,) 平移(与 R 同类型)。

info: dict。"rmse"(采用对应上的最终RMSE), "iters"(实际迭代次数),

"converged"(bool), "inliers"(采用的对应数), "rmse_history"(list)。

参考(示例数据、文献)

• 示例数据目录(下载 URL / 许可证) —— 2-D 用 skimage.data(BSD/公有领域)加合成图,3-D 给出真实数据源(Stanford/PDS 等)的下载 URL。

• 算子来历与参考文献 —— 该算子族所依据的研究/方法出处。

可运行的示例(实际调用该算子并已验证的样例)

• 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 作为输入)

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 算子登记表。本条目由 tools/opdocs.py md 自动生成(请勿手工编辑)。*

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