register_fpfh — 3D feature_register op

• 数据种类:points × points → pose

• 调用: import fullseye as fs; fs.ledger.register_fpfh(src, dst, src_normals=None, dst_normals=None, voxel_size=None, normal_k=16, feature_k=60, n_bins=11, ransac_iters=8000, inlier_thr=None, edge_sim=0.9, mutual=True, ratio=0.95, seed=0, device='cpu')(要直接调用实现,import feat_fpfh; feat_fpfh.register_fpfh(src, dst, src_normals=None, dst_normals=None, voxel_size=None, normal_k=16, feature_k=60, n_bins=11, ransac_iters=8000, inlier_thr=None, edge_sim=0.9, mutual=True, ratio=0.95, seed=0, device='cpu');从台账取用则 ops3d.get("register_fpfh"))

• GPU:无(仅 CPU 参考实现)

用法

用 FPFH 描述子 + RANSAC 做 无需初值 的刚体配准 (R,t)。

稀疏特征匹配的 3D 版本,相当于 2D Harris/SIFT。两种云都由 FPFH 描述符表示,使用描述符空间中的最近邻创建对应关系(相互最近邻+按 Lowe 比率过滤),并使用 RANSAC 来解决对异常值稳健的刚体姿势。与紧密匹配(NCC/Hough)和PCA不同,大旋转(50-70°)其价值在于,即使+平移+部分重叠,也无需初始估计即可确定姿势。得到的(R,t)即为ICP的初始值(粗略初始化)收紧表面精度(ICP 约定 dst ≈ src @ R.T + t)。

管道:

1)体素下采样(独立采样2)将云附近的区域对齐到共同的分辨率。

(需要进行预处理,极大地影响FPFH的正确响应率)。

2) 正常估计(局部PCA)。如果您传递 src_normals/dst_normals,它将被使用。

3)FPFH描述符(SPFH→距离权重合成)。

4)描述符NN匹配(相互+比率)。

5)RANSAC:3点样本→边长匹配预过滤器→卡布希→全点适应度

(src 转换所有点,dst 表示最近邻落在阈值内的速率)。仅兼容(~100 分)

评分往往固定在不正确的姿势上,因此通过全点健身使其变得稳健。

6) 重新安装相应的内圈以获得最佳姿势。

论据:

src (N,3), dst (M,3):要对齐的两个点组(numpy/torch)。

src_normals、dst_normals((N,3)/(M,3)或无):先前的法线。如果没有,内部估计

(但是,当 voxel_size>0 时,坐标会发生变化,因此总是会重新估计)。

voxel_size(浮点或无):下采样边长。自动采用 DST 分辨率 x 2.5(无)。

使用 0 禁用(保留原始点云;不建议用于独立采样)。

Normal_k (int):正常估计的邻居数量。

feature_k (int):FPFH的邻居数量(数量越大,描述符越稳定和具有区分性。建议在60左右)。

n_bins (int):每个特征的直方图箱数(描述符维度 = 3*n_bins)。

ransac_iters (int):RANSAC 迭代次数。

inlier_thr(float 或 None):内部距离阈值。无(下采样后)分辨率 x 3。

edge_sim (float):三重边长比的容差(0<edge_sim<=1,越接近1越严格)。

mutual (bool):相互最近邻过滤器。比率(浮动或无):低比率。

种子(int):RANSAC随机数种子(重新启动时更改)。 device (str):返回张量的设备。

返回值:

R (3,3) torch.Tensor(在设备上), t(3,) torch.Tensor,

信息字典:{“n_corr”(对应数),“inliers”(内点数),“inlier_ratio”,

“适应度”(全点适应度=重启选择指数),“rmse”(内值RMSE),

“inlier_thr”,“src_corr”,“dst_corr”(相应索引)}。

注(诚实):FPFH是粗配准,独立采样+噪声+部分重叠在困难条件下,仍会存在几度的旋转误差(实测:旋转62°,重叠~64%,噪声0.5×分辨率)RANSAC 后中值~4.4°,~90% <8°,剩余~10% 接近 8-9°。使用 ICP 拧紧时为 100% <8°,中值~0.5°)。当噪声变得等于或高于点间距(分辨率)时,法线和角特征变为

塌陷的描述符失去了判别力(实测:当噪声≥1.0×分辨率时成功率下降)。 RANSAC是随机选择因此,实际操作中,建议重启几次,取最大结果info[“fitness”]。

背景知识指南(该算子背后的物理与约定)

• blas_threads_and_memory — 矩阵分解为何慢 —— BLAS 线程、缓存、内存布局

参考(示例数据、文献)

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

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

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

• feature_register — py -3.11 examples_3d/feature_register.py

类型可衔接的下一个算子(可接受 pose 作为输入)

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_shot


*Provenance: feat_fpfh.py — 3D 算子登记表。本条目由 tools/opdocs.py md 自动生成(请勿手工编辑)。*

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