annotate3d_project — 3D annotate3d op

• Datenarten: points → table

• Aufruf: import fullseye as fs; fs.ledger.annotate3d_project(points, pose, K, depth=None, shape=None, occlusion_tol=0.01) (die Implementierung direkt: import annotate3d; annotate3d.annotate3d_project(points, pose, K, depth=None, shape=None, occlusion_tol=0.01); aus dem Register: ops3d.get("annotate3d_project"))

Verwendung

Liefert eine Tabelle (dict): Pixelkoordinaten, Vorwärtsabstand und Im-Bild-/Verdeckt-Befunde für 3-D-Punkte (project_anchors).

Ein Op, der "nur projiziert" und nichts zeichnet. Er gibt genau die Tests, die alle annotate3d-Zeichen-Ops intern verwenden, unverändert als Tabelle zurück; man nutzt ihn für eigene Plots, numerische Prüfung und Verzweigungen nach "ist dieser Punkt sichtbar?".

Projektion (geschlossene Form, gleiche Konvention wie render3d): X_c = R X + t (pose ist eine 4x4- object→camera-Matrix oder ein 2-Tupel (R, t)). Die Kamera blickt entlang lokal -Z, daher ist der Vorwärtsabstand z = -X_c[2]. Pixel sind u = fx X_c[0]/z + skew X_c[1]/z + cx, v = cy - fy X_c[1]/z (K ist 3x3; auch der Skew K[0,1] wird verwendet. Pixelmitten liegen auf ganzzahligen Koordinaten, u = Spalte, v = Zeile).

Argumente:

• points: (N, 3) oder (3,) (Objektkoordinaten, endlich).

• depth: (H, W)-Bild des Vorwärtsabstands (das depth von render3d.render_mesh; Hintergrund ist +inf). Wird es übergeben, wird shape daraus genommen und Verdeckung geprüft.

• shape: (H, W). Für den Test "im Bild", wenn kein depth vorhanden ist.

• occlusion_tol: [0, 1). Gilt für die Pixeltiefe d die Bedingung d < z * (1 - tol), ist der Punkt verdeckt (Toleranz für die z-buffer-Diskretisierung).

Rückgabewert (dict, alle der Länge N):

• uv (N, 2) float -- (u, v)-Pixelkoordinaten. NaN für Punkte dahinter.

• depth (N,) -- Vorwärtsabstand z (dahinter negativ).

• in_front -- z > 1e-9.

• in_image -- 0 <= u <= W-1 und 0 <= v <= H-1 (nur Punkte davor). Alle True (ungeprüft), wenn weder shape noch depth vorhanden ist.

• hidden -- nur geprüft, wenn depth vorhanden ist (Pixel per Rundung auf den nächsten Nachbarn). Sonst alle False.

• visible = in_front & in_image & ~hidden.

Validierung (ValueError): pose ist weder 4x4 noch (R, t), nicht endlich, oder die Determinante des Rotationsteils ist fast 0 / K ist nicht 3x3, nicht endlich, oder fx bzw. fy ist 0 / points hat eine falsche Form oder ist nicht endlich / depth ist nicht 2-D, passt nicht zu shape oder enthält NaN / occlusion_tol liegt außerhalb von [0, 1). Punkte hinter der Kamera sind hier kein Fehler (sie werden mit in_front=False zurückgegeben; die Zeichen-Ops machen daraus einen ValueError).

Hinweis: camera.project_points folgt einer anderen Konvention, die entlang +Z blickt (OpenCV-Stil); übergibt man deren Pose, gelten alle Punkte als dahinter. Die an render3d.render_mesh übergebenen pose / intrinsics unverändert übergeben.

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)

• annotate3d_figure — py -3.11 examples_3d/annotate3d_figure.py

Typkompatible Folge-Operatoren (nehmen table als Eingabe)

fuse_to_voxel · mesh_select_lod

Gleiche Kategorie (annotate3d)

annotate3d_arrow · annotate3d_label · annotate3d_scale_bar · annotate3d_axes · annotate3d_bbox · annotate3d_measure


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