feature_register op• Datenarten: points × points → pose
• Aufruf: import fullseye as fs; fs.ledger.register_shot(src, dst, radius=None, normal_k=16, ratio=0.9, ransac_iters=2000, inlier_thr=None, refine_icp=True, max_kp=400, device='cpu', seed=0) (die Implementierung direkt: import feat_shot; feat_shot.register_shot(src, dst, radius=None, normal_k=16, ratio=0.9, ransac_iters=2000, inlier_thr=None, refine_icp=True, max_kp=400, device='cpu', seed=0); aus dem Register: ops3d.get("register_shot"))
Spärliches Merkmalsmatching mit SHOT-Deskriptoren plus RANSAC-Starrkörper-Posenschätzung (die gesamte Pipeline).
Ordnet ohne Anfangsschätzung 2 Punktwolken mit großer Rotation und teilweiser Überlappung einander zu und gibt die Starrkörpertransformation (Rotation R + Translation t) zurück. Anders als dichtes Matching (NCC/Hough/PCA) spannt es an jedem ISS- Keypoint ein lokales Referenzsystem (LRF) auf, beschreibt es mit Histogrammen der Normalenwinkel über kugelförmig unterteilte Zellen (SHOT) → matcht mit dem Lowe-Ratio-Test + gegenseitigem nächstem Nachbarn → schätzt die Pose mit RANSAC robust gegen Ausreißer. Die erhaltene Pose kann auch den groben Anfangswert (coarse init) für ICP liefern.
Vorzeichenmehrdeutigkeit des LRF: Die Eigenvektoren der distanzgewichteten Kovarianz haben kein festes Vorzeichen, daher wird jede Achse (x=größter, z=kleinster Eigenwert) auf die Mehrheit der Projektionen der Nachbarvektoren (p_i-p) ausgerichtet (Vorzeichenregel nach Tombari), und y=z×x bildet ein Rechtssystem. Auch die Punktnormalen werden nach derselben Regel weg von der Nachbarschaftsmasse (lokal nach außen) vereinheitlicht und sind daher kovariant zur Rotation und stabil bei teilweiser Überlappung. Die Anwendung derselben Regel auf beide Punktwolken sichert die repeatability des Deskriptors.
Argumente:
src, dst: (N,3)/(M,3) Punktwolken (numpy oder torch). src wird auf dst ausgerichtet.
radius: SHOT-Stützradius. None nimmt das 0.15-fache der bbox-Diagonale jeder Punktwolke selbst (die kleinere)
(die gemeinsame bbox wird nicht verwendet, da die Translation ihre Diagonale aufbläht und die Skala verfälscht).
normal_k: knn-Anzahl für die Normalenschätzung.
ratio: Schwellwert des Lowe-Ratio-Tests (kleiner ist strenger).
ransac_iters: Anzahl der RANSAC-Iterationen.
inlier_thr: RANSAC-Inlier-Distanz. None nimmt das 0.03-fache der bbox-Diagonale.
refine_icp: bei True wird die erhaltene Pose als Anfangswert mit Trimmed ICP (icp_point2point_3d) verfeinert.
max_kp: Obergrenze der Keypoints.
device: torch-Device ("cpu" usw.). SVD/ICP werden darauf gelöst.
seed: Zufalls-Seed für RANSAC.
Rückgabewert:
R: (3,3) numpy. Rotation, die dst ≈ src @ R.T + t erfüllt (gleiche Konvention wie icp).
t: (3,) numpy. Translation.
info: dict. "n_kp_src","n_kp_dst","n_matches","n_inliers","inlier_ratio",
"icp_rmse" (bei refine_icp),"ok" (True=Schätzung erfolgreich; weniger als 4 Inlier gelten
als unzuverlässig und liefern False + die Identitätstransformation).
• 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_spin · register_fpfh
*Provenance: feat_shot.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.