icp_point2point_3d — 3D refine op

• Datenarten: points × points → pose

• Aufruf: 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) (die Implementierung direkt: 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); aus dem Register: ops3d.get("icp_point2point_3d"))

Verwendung

Verfeinert Punktmengen mit Point-to-Point-ICP (Kabsch/SVD).

Ausgehend von der Anfangspose (init_R, init_t) aus einer groben Match-Schätzung (ganzzahliges NCC / Fourier-Mellin±3° / Hough±0.5voxel) registriert es die src-Punktwolke per Starrkörpertransformation auf die dst-Punktwolke. In jeder Iteration werden die Nächster-Nachbar-Korrespondenzen (cKDTree) neu aufgebaut, mit dem Kabsch-Algorithmus (SVD) relative Rotation und Translation bestimmt und akkumuliert, sodass es auch ohne bekannte Korrespondenzen auf Subvoxel-Genauigkeit konvergiert.

Teilüberlappung und Ausreißer werden mit Trimmed ICP (nur Korrespondenzen mit kleinem Abstand werden verwendet) und einem absoluten Abstandsgate (max_corr_dist) behandelt. Der finale RMSE wird über die tatsächlich verwendeten Korrespondenzen (Inlier) ausgewertet und spiegelt daher die Posenqualität auch bei Teilbeobachtungen korrekt wider.

Argumente:

src: (N,3) bewegte Punktwolke (torch.Tensor oder numpy.ndarray).

dst: (M,3) feste (Referenz-)Punktwolke.

iters: maximale Anzahl der Iterationen.

init_R: (3,3) Anfangsrotation. Bei None die Einheitsmatrix.

init_t: (3,) Anfangstranslation. Bei None der Nullvektor.

tol: Abbruch als konvergiert, wenn die relative RMSE-Verbesserung diesen Wert unterschreitet.

max_corr_dist: Korrespondenzen jenseits dieses Abstands werden als Ausreißer verworfen (None deaktiviert).

trim_ratio: 0<r<=1. Trimmed ICP, das in jeder Iteration nur den obersten Anteil r der Korrespondenzen mit dem kleinsten

Nächster-Nachbar-Abstand verwendet. Wirksam bei Teilüberlappung (Überlappungsgrad r). None deaktiviert.

device: torch-Gerät ("cpu" usw.). Die SVD wird auf diesem Gerät gelöst.

reproducible: bei True hängen die Reduktionen nicht von der Punktreihenfolge und der Zahl der BLAS-Threads ab (Standard False = wie bisher).

Der Mittelwert nutzt math.fsum, die Kreuzkovarianz H ozakimm (Ozaki-Schema), die Pose wird elementweise angewandt, der RMSE nutzt ebenfalls math.fsum.

Auch bei vertauschter Reihenfolge der src-Punkte sind R, t und rmse bitgleich (auf demselben Rechner, mit demselben LAPACK). Punkte, deren Abstände an der

trim_ratio-Grenze exakt gleich sind, können je nach Reihenfolge anders ausgewählt werden. Bei 200.000 Punkten werden aus 0.7 ms pro 1 Iteration etwa 170 ms.

Rückgabewert:

R: (3,3) Rotation. Erfüllt dst ~= src @ R.T + t. In einer Umgebung mit torch ein torch.Tensor, sonst ein numpy.ndarray mit denselben Werten (als der Kern am 2026-09-07

auf numpy umgestellt wurde, blieb der Typ aus Kompatibilitätsgründen erhalten).

★icp_point2plane aus derselben Familie gibt immer numpy zurück — innerhalb der Familie

sind die Typen nicht einheitlich, daher ist es sicher, nachgelagert np.asarray(R) zu verwenden

(beides funktioniert; diese Uneinheitlichkeit bleibt bestehen, um eine inkompatible Änderung zu vermeiden).

t: (3,) Translation (gleicher Typ wie R).

info: dict. "rmse" (finaler RMSE über die verwendeten Korrespondenzen), "iters" (tatsächliche Iterationszahl),

"converged" (bool), "inliers" (Anzahl verwendeter Korrespondenzen), "rmse_history" (list).

Referenzen (Beispieldaten, Literatur)

• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).

• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.

Ausführbare Beispiele (verifizierte Samples, die diesen Operator wirklich aufrufen)

• 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

Typkompatible Folge-Operatoren (nehmen pose als Eingabe)

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

Gleiche Kategorie (refine)

refine_peak_newton · refine_translation_lk · refine_lm · refine_rotation_z · icp_point2plane


*Provenance: match3d.py — 3D Operator-Registry. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*

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