annotate3d op• Datenarten: image2d → image2d
• Aufruf: import fullseye as fs; fs.ledger.annotate3d_axes(img, pose, K, origin=(0.0, 0.0, 0.0), length=1.0, depth=None, labels=('X', 'Y', 'Z'), colors=('wrong', 'right', 'reference'), width=2, font_size=11, occlusion_tol=0.01, scheme='okabe_ito', font_path=None) (die Implementierung direkt: import annotate3d; annotate3d.annotate3d_axes(img, pose, K, origin=(0.0, 0.0, 0.0), length=1.0, depth=None, labels=('X', 'Y', 'Z'), colors=('wrong', 'right', 'reference'), width=2, font_size=11, occlusion_tol=0.01, scheme='okabe_ito', font_path=None); aus dem Register: ops3d.get("annotate3d_axes"))
Liefert ein Bild (image2d): die drei Achsen der object-Koordinaten (Eingangsseite von pose) als Gnomon, projiziert ab origin.
ValueError
length ist nicht positiv, der Ursprung oder ein Achsenende liegt hinter der Kamera, labels/colors sind nicht 3 Stück,
der Achsentext passt nicht ins Bild, Ursprung und Achsenende liegen beide außerhalb des Bildes.
Ablauf: origin und die 3 Punkte, die man von dort in object-Richtung +X / +Y / +Z nach length erreicht, projizieren (gleiche Konvention wie annotate3d_project) und vom Ursprungspixel zu jedem Achsenendpixel annotate.arrow zeichnen (Pfeilspitze 8x6 px). An einer Position 0.7 * font_size px hinter dem Achsenende labels[i] als Text ohne Hintergrund (box_alpha=0) platzieren.
Argumente:
• origin (3,) (Objektkoordinaten), length: Achsenlänge (Mesh-Einheiten, > 0).
• labels: 3 Strings (Standard ("X", "Y", "Z")). colors: 3 Farben (Rollennamen oder RGB; der Standard ("wrong", "right", "reference") sind Rollennamen der Palette).
• width: Linienbreite [px], ganze Zahl ab 1. font_size [px].
• depth / occlusion_tol: werden an die Projektion übergeben, aber dieser Op zeigt keine Verdeckung an (Strichelung) (der Test dient nur der Formprüfung von depth).
Rückgabewert: ein neues, gezeichnetes Bild (float64 [0, 1]).
Fehlerbedingungen: length <= 0 / die Länge von labels oder colors ist nicht 3 / der Ursprung oder eines der Achsenenden hat z <= 1e-9 / ungültige Pose, K oder depth / der Achsen- text passt nicht ins Bild / Ursprung und Achsenende liegen beide außerhalb des Bildes (annotate.arrow lehnt ab). Liegt nur das Achsenende außerhalb des Rahmens, wird gezeichnet (der Pfeil läuft nach außen). Eine Achse, die mit der Sichtlinie zusammenfällt und zu einem Punkt kollabiert (Pixellänge unter 1e-9), wird stillschweigend übersprungen.
Einsatz: Erläuterung der Pose einer Abbildung (gnomon). Die pose von render3d.look_at unverändert übergeben und origin auf den Schwerpunkt des Meshs oder eine Ecke von bounds legen. Koordinatensystem: origin und die Achsenrichtungen werden im Ausgangssystem von pose gelesen (object-Koordinaten). Die pose aus look_at ist world→camera, dann sind es also die Weltachsen. Übergibt man pose @ M, das die Lage M des Objekts (object→world) enthält, werden die Achsen des Objekts gezeichnet.
• 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.
• annotate3d_figure — py -3.11 examples_3d/annotate3d_figure.py
image2d als Eingabe)fuse_to_voxel · fit_poly_surface · eval_poly_surface · surface_form_error · background_flatten · polar_unwrap · fit_zernike · matcap_shade
annotate3d)annotate3d_project · annotate3d_arrow · annotate3d_label · annotate3d_scale_bar · 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.