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

Verwendung

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.

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