feature_register op• Datenarten: points × points → pose
• Aufruf: 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') (die Implementierung direkt: 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'); aus dem Register: ops3d.get("register_fpfh"))
• GPU: nein (nur CPU-Referenzimplementierung)
Schätzt die starre Ausrichtung (R,t) ohne Startschätzung mit FPFH-Deskriptoren und RANSAC.
Eine 3D-Version des spärlichen Feature-Matchings, äquivalent zum 2D-Harris/SIFT. Beide Wolken werden durch FPFH-Deskriptoren dargestellt, Erstellen Sie eine Korrespondenz unter Verwendung der nächsten Nachbarn im Deskriptorraum (gegenseitige nächste Nachbarn + Filter nach Lowe-Verhältnis) und verwenden Sie dazu RANSAC Lösung von Starrkörper-Posen, die robust gegenüber Ausreißern sind. Im Gegensatz zu Close Match (NCC/Hough) und PCA, große Rotation (50-70°) Der Wert besteht darin, dass die Pose auch bei +Translation + teilweiser Überlappung ohne anfängliche Schätzung bestimmt werden kann. Der erhaltene (R,t) ist der Anfangswert von ICP (grobe Init) wird auf Oberflächengenauigkeit verschärft (ICP-Konvention von dst ≈ src @ R.T + t).
Pipeline:
1) Voxel-Downsampling (unabhängige Abtastung). 2 Richten Sie die Umgebung von Wolken auf eine gemeinsame Auflösung aus. (Erforderliche Vorverarbeitung, die die korrekte Antwortrate von FPFH stark beeinflusst).
2) Normale Schätzung (lokale PCA). Wenn Sie src_normals/dst_normals übergeben, wird es verwendet.
3) FPFH-Deskriptor (SPFH → Distanzgewichtssynthese).
4) Deskriptor-NN-Übereinstimmung (gegenseitig + Verhältnis).
5) RANSAC: 3-Punkt-Probe → kantenlängenangepasster Vorfilter → Kabsch → All-Point-Fitness (src konvertiert alle Punkte und dst die Rate, mit der der nächste Nachbar innerhalb des Schwellenwerts liegt). Nur kompatibel (~100 Punkte). Die Wertung basiert in der Regel auf falschen Körperhaltungen und wird daher durch All-Point-Fitness stabilisiert.
6) Für die beste Haltung mit dem entsprechenden Inlier ausrüsten.
Argumente:
src (N,3), dst (M,3): Zwei auszurichtende Punktgruppen (Numpy/Torch).
src_normals, dst_normals ((N,3)/(M,3) oder Keine): Vorherige Normalen. Wenn keine, interne Schätzung
(Wenn jedoch voxel_size>0 ist, ändern sich die Koordinaten, sodass sie immer neu geschätzt werden).
voxel_size (float oder None): Downsampling-Seitenlänge. Übernimmt automatisch die DST-Auflösung x 2,5 mit „Keine“.
Mit 0 deaktivieren (bleibt rohe Punktwolke; nicht für unabhängige Stichproben empfohlen).
normal_k (int): Anzahl der Nachbarn für die normale Schätzung.
feature_k (int): Anzahl der Nachbarn von FPFH (je größer die Zahl, desto stabiler und diskriminierender ist der Deskriptor. Etwa 60 wird empfohlen).
n_bins (int): Anzahl der Histogramm-Bins pro Feature (Deskriptordimension = 3*n_bins).
ransac_iters (int): RANSAC-Iterationsnummer.
inlier_thr (float oder None): Inlier-Entfernungsschwellenwert. Keine (nach Downsampling) Auflösung x 3.
edge_sim (float): Toleranz des dreifachen Kantenlängenverhältnisses (0<edge_sim<=1, näher an 1 ist strenger).
Mutual (bool): Gegenseitiger Filter für den nächsten Nachbarn. Verhältnis (Float oder Keine): Lowe-Verhältnis.
Seed (int): RANSAC-Zufallszahlen-Seed (Änderung beim Neustart). Gerät (str): Gerät des Rückkehrtensors.
Rückgabewert:
R (3,3) Torch.Tensor(auf dem Gerät), t (3,) Torch.Tensor,
info dict: {"n_corr"(Anzahl der Korrespondenzen), "inliers"(Anzahl der Inliers), "inlier_ratio",
„fitness“ (All-Point-Fitness = Neustart-Auswahlindex), „rmse“ (inlier RMSE),
„inlier_thr“, „src_corr“, „dst_corr“ (entsprechender Index)}.
Hinweis (ehrlich): FPFH ist eine grobe Registrierung, unabhängige Abtastung + Rauschen + teilweise Überlappung Unter schwierigen Bedingungen bleibt ein Rotationsfehler von mehreren Grad bestehen (tatsächliche Messung: 62° Rotation, Überlappung ~64 %, Rauschen 0,5 × Auflösung) Post-RANSAC-Median ~4,4°, ~90 % <8°, verbleibende ~10 % grenzen an 8–9°. 100 % bei Verspannung mit ICP <8°, Median ~0,5°). Wenn das Rauschen gleich oder größer als der Punktabstand (Auflösung) wird, werden die Normalen- und Eckmerkmale sichtbar Der kollabierte Deskriptor verliert seine Unterscheidungskraft (tatsächliche Messung: Die Erfolgsrate sinkt, wenn das Rauschen ≥ 1,0 × Auflösung ist). RANSAC ist eine Zufallsauswahl Daher wird im tatsächlichen Betrieb empfohlen, mehrmals neu zu starten und das maximale Ergebnis info["fitness"] zu erzielen.
• 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_shot
*Provenance: feat_fpfh.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.