pnp_ransac — 3D pose_estimation op

• Datenarten: points × keypoints → pose

• Aufruf: import fullseye as fs; fs.ledger.pnp_ransac(points_3d, points_2d, K, thresh=2.0, iters=300, seed=0) (die Implementierung direkt: import pnp3d; pnp3d.pnp_ransac(points_3d, points_2d, K, thresh=2.0, iters=300, seed=0); aus dem Register: ops3d.get("pnp_ransac"))

Verwendung

Ausreißerrobustes PnP (RANSAC plus abschließendes DLT-Refit). → (R, t, inlier_mask, info).

DLT auf minimalen Stichproben von 6 Punkten (ohne Verfeinerung) → Inlier mit Reprojektionsfehler < thresh maximieren → Neuanpassung mit pnp_pose (mit Verfeinerung) auf allen Inliern.

Raises ValueError: points_2d ist nicht (N,2) / points_3d ist nicht (N,3) /

Punktzahlen ungleich / weniger als 6 Punkte / nicht endlich.

Argumente:

• thresh: Schwellwert des Reprojektionsfehlers [px] (euklidischer Abstand, Standard 2.0). Werte darunter gelten als Inlier.

• iters: Anzahl der Iterationen (Standard 300). Es gibt keinen vorzeitigen Abbruch, es läuft immer genau so oft. Jede Iteration zieht 6 Punkte ohne Zurücklegen und löst nur die Anfangspose (entartete Stichproben werden verworfen, weiter mit der nächsten).

• seed: wird an numpy.random.default_rng(seed) übergeben. Bei gleicher Eingabe und gleichem seed ist das Ergebnis reproduzierbar.

Rückgabewert: R (3,3), t (3,) (Konvention Xc = R X + t), inlier_mask bool (N,), info dict. Die Schlüssel von info sind n_inliers / inlier_ratio / iters / rms (Reprojektions-RMS [px] der Endpose, auf der Inlier-Menge).

• Hat die beste Stichprobe weniger als 6 Inlier, greift ein Fallback, der mit allen Punkten neu löst, und info["fallback"] = True wird gesetzt. Dann ist inlier_mask der mit der Fallback-Pose neu gezählte gemessene Wert, sodass inlier_ratio klein zurückkommen kann (Konsens wird nicht vorgetäuscht). Scheitert auch der Fallback, ValueError.

• Der Vergleich der Inlier-Zahl aktualisiert nur bei "mehr", bei Gleichstand bleibt also die zuerst gefundene Stichprobe.

• Die Endpose ist eine Neuanpassung auf allen Inliern (mit LM-Verfeinerung).

• Raises ValueError: ungültige Form / weniger als 6 Punkte / Punktzahlen ungleich / nicht endlich (dieselben Eingangsprüfungen wie dlt_pose).

• Bewertung mit reprojection_error, Vergleich mit GT über pose_error.

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)

• pnp_pose_outliers — py -3.11 examples_3d/pnp_pose_outliers.py

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

dlt_pose · reprojection_error


*Provenance: pnp3d.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.