feature_register op• Datenarten: points × points → pose
• Aufruf: import fullseye as fs; fs.ledger.register_spin(src, dst, device='cpu', n_keypoints=220, normal_k=18, support_radius=None, n_alpha=16, n_beta=16, support_angle_deg=60.0, lowe_ratio=0.85, ransac_iters=4000, inlier_thr=None, min_inliers=8, seed=0) (die Implementierung direkt: import feat_spin; feat_spin.register_spin(src, dst, device='cpu', n_keypoints=220, normal_k=18, support_radius=None, n_alpha=16, n_beta=16, support_angle_deg=60.0, lowe_ratio=0.85, ransac_iters=4000, inlier_thr=None, min_inliers=8, seed=0); aus dem Register: ops3d.get("register_spin"))
Starre Ausrichtung über spärliche Merkmale ohne Startschätzung, mit Spin-Image-Deskriptoren und RANSAC.
Registriert 2 Punktwolken src (N,3), dst (M,3) ohne Vorwissen über die Anfangspose. Mit der Normale jedes Punkts (lokale PCA, Vorzeichen vom Schwerpunkt nach außen vereinheitlicht = invariant unter Starrkörpertransformationen) als Achse werden Nachbarpunkte in ein 2D-Histogramm aus (α=Abstand von der Achse, β=Höhe entlang der Achse) "gedreht (spin)" akkumuliert; so entsteht der Spin-Image-Deskriptor (Johnson & Hebert 1997) pro Keypoint, gematcht wird über den nächsten Nachbarn im Deskriptorraum (gefiltert mit dem Lowe ratio test), und RANSAC (minimale 3-Punkt-Stichprobe + Kabsch) schätzt eine gegen Ausreißer robuste Starrkörpertransformation. Anders als dichtes Matching (NCC/Phasenkorrelation/Hough) oder PCA-Hauptachsenausrichtung kann es die Pose auch bei großer Rotation + teilweiser Überlappung aus Korrespondenzen lokaler Merkmale wiederherstellen und eignet sich daher als Vorstufe von ICP (Lieferung der coarse init). Die zurückgegebene Pose folgt der Konvention dst ~= src @ R.T + t (= R @ src_i + t) (identisch mit icp_point2point_3d).
Argumente:
src: (N,3) bewegte Punktwolke (numpy.ndarray oder torch.Tensor).
dst: (M,3) feste (Referenz-)Punktwolke.
device: torch-Device ("cpu" usw.). SVD/Endpose werden darauf gelöst.
n_keypoints: Anzahl der Keypoints, die aus jeder Punktwolke extrahiert werden (gleichabständiges Subsampling).
normal_k: Anzahl der Nachbarpunkte für die Normalenschätzung (lokale PCA).
support_radius: Stützradius des Spin Image. None nimmt das 0.30-fache der bbox-Diagonale jeder Punktwolke einzeln gemessen (die größere)
(einzeln statt über die Vereinigung gemessen, damit die unbekannte Translation sie nicht verfälscht).
n_alpha, n_beta: Anzahl der (α, β)-Bins des Spin Image (der Deskriptor hat n_alpha*n_beta Dimensionen).
support_angle_deg: Schwellwert des Stützwinkels (Grad). Nur Stützpunkte, deren Normale innerhalb dieses Winkels zur Keypoint-Normale liegt,
werden akkumuliert (robust gegen Verdeckung und Rückseiten). >=90 deaktiviert ihn.
lowe_ratio: Schwellwert des Lowe-Ratio-Tests (nur Korrespondenzen mit d1 < ratio*d2 werden übernommen).
ransac_iters: Anzahl der RANSAC-Iterationen.
inlier_thr: Inlier-Distanzschwellwert von RANSAC. None nimmt das 0.04-fache der bbox-Diagonale.
min_inliers: minimale Inlier-Anzahl, ab der eine Pose als gültig gilt (Entscheidung ok).
seed: Zufalls-Seed für RANSAC.
Rückgabewert:
R: (3,3) torch.Tensor. Rotation, die dst ~= src @ R.T + t erfüllt.
t: (3,) torch.Tensor. Translation.
info: dict. "n_matches" (Korrespondenzen, die den ratio test bestehen), "inliers" (RANSAC final),
"inlier_ratio", "rmse" (RMSE über die Inlier), "support_radius",
"inlier_thr", "ok" (ob mindestens min_inliers).
Hinweise:
• Der Deskriptor hängt vom Normalenvorzeichen ab. Die Vereinheitlichung nach außen vom Schwerpunkt wirkt bei Formen, deren Normalen ungefähr radial sind und bei denen das Vorzeichen von n·(p-Schwerpunkt) stabil ist (lumpy geschlossene Flächen usw.). Bei Formen mit vielen Bereichen mit n·(p-Schwerpunkt)≈0, etwa dünnen Platten oder Rohren, kann das Vorzeichen zwischen den 2 Wolken kippen.
• Bereiche mit räumlich gleichförmiger Krümmung wie Ebenen und Kugeln liefern entartete Deskriptoren, und der ratio test entfernt ihre Korrespondenzen (ungeeignet für merkmalslose Formen). Fällt die overlap unter etwa 60%, sinkt die Erfolgsrate stark, und im Fehlerfall kann RANSAC auf eine geometrisch konsistente, aber falsche Lösung einrasten, was einen katastrophalen Fehler ergibt (die Kombination mit den Gates ok / inlier_ratio wird empfohlen).
• blas_threads_and_memory — Warum Matrixzerlegungen langsam sind — BLAS-Threads, Caches, Speicherlayout
• 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.
• feature_register — py -3.11 examples_3d/feature_register.py
pose als Eingabe)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_fpfh · register_shot
*Provenance: feat_spin.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.