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.