register_spin — 3D 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"))

Verwendung

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).

Hintergrundwissen (Physik und Konventionen hinter diesem Operator)

• blas_threads_and_memory — Warum Matrixzerlegungen langsam sind — BLAS-Threads, Caches, Speicherlayout

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)

• feature_register — py -3.11 examples_3d/feature_register.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 (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.