camera_orientation_from_sun_candidates — GEOCAM sun op

• Datenarten: keypoints × signal × signal → table

• Aufruf: import fullseye as fs; fs.ledger.camera_orientation_from_sun_candidates(candidates, frame_index, unix_times, lat_deg, lon_deg, shape, K=None, hfov_range_deg=(25.0, 120.0), tol_px=20.0, roll_max_deg=12.0, pitch_range_deg=(-40.0, 0.0), min_dt=1800.0, max_pairs=600, seed=0) (die Implementierung direkt: import geocam; geocam.camera_orientation_from_sun_candidates(candidates, frame_index, unix_times, lat_deg, lon_deg, shape, K=None, hfov_range_deg=(25.0, 120.0), tol_px=20.0, roll_max_deg=12.0, pitch_range_deg=(-40.0, 0.0), min_dt=1800.0, max_pairs=600, seed=0); aus dem Register: opsgeocam.get("camera_orientation_from_sun_candidates"))

Verwendung

Wählt aus mehreren Kandidaten für "helle Blobs" pro Frame (gemischt aus Sonne, weißen Autos, Schildern und Text) per RANSAC die 1 Spur, die sich zeitgerecht bewegt, und bestimmt (yaw, pitch, roll) und die Brennweite gleichzeitig → table. Bei fester Kamera bewegt sich nur die Sonne mit Sonnengeschwindigkeit, daher wird die Sonne über ihre Bewegung statt über ihr Aussehen bestimmt (bei Fintraffic-Wetterkameras lieferte ein Aussehens-Gate 24/24 Fehldetektionen, 2026-09-21).

Hypothese = je 1 Kandidat aus 2 Frames mit Zeitdifferenz ≥ min_dt → dieselbe Wahba- 2-Punkt-Lösung wie bei camera_orientation_from_sun. Hypothesen, die das Vorwissen über Straßenkameras nicht erfüllen (|roll| ≤ roll_max_deg, pitch in pitch_range_deg, horizontaler Bildwinkel in hfov_range_deg), werden verworfen -- bei 4 Freiheitsgraden (Rotation 3 + Brennweite) und vielen Kandidaten kann ein zufälliges Tripel von 3 Punkten eine unphysikalische Pose durchlassen. Stimmen = Anzahl der Frames mit einem Kandidaten innerhalb von tol_px um die vorhergesagte Position (Zeiten unter dem Horizont stimmen nicht ab). Echte Bloom-Zentren schwanken um 5 bis 13 px (Wolken, Belichtung), daher der Standard 20 px. Mit den Inliern der besten Hypothese wird die Brennweite in 1 Dimension optimiert und die Rotation auf allen Punkten neu bestimmt (2 Mal).

Auch die Spiegelung der Sonne auf nasser Fahrbahnoberfläche bewegt sich mit der Geschwindigkeit der Sonne (ein Spiegelbild), daher lassen sie sich durch Bewegung allein nicht unterscheiden. Die Spiegelung liegt im unteren Bildteil (Fahrbahnoberfläche), passt man sie als Sonne an, ergibt sich eine Pose, bei der "die Kamera nach oben schaut" (pitch > 0) -- die standardmäßige Obergrenze 0 von pitch_range_deg ist das Gate dafür (Straßenkameras schauen nicht nach oben). Für nach oben gerichtete Kameras erweitern. Eine unabhängige Gegenprobe (Elevation des Fluchtpunkts der Fahrstreifen ≈ 0) wird ebenfalls empfohlen.

Wird K übergeben, wird es verwendet (die Brennweite wird nicht gesucht). Bei K=None ist der Hauptpunkt die Bildmitte, und fx = fy = f wird im Bereich von hfov_range_deg gesucht -- öffentliche Kameras haben normalerweise keine intrinsischen Parameter.

Args:

candidates: (N, 2) (u, v). Gestapelte Kandidaten aller Frames (Ausgabe von sun_bloom_fit oder sun_pixel_position).

frame_index: (N,) zu welchem Frame jeder Kandidat gehört (Index in unix_times, ganzzahlige Werte).

unix_times: (F,) UNIX-Sekunden (UTC) jedes Frames.

lat_deg, lon_deg: Kameraposition.

shape: (H, W).

K: (fx, fy, cx, cy) oder None.

Returns:

table: yaw_deg / pitch_deg / roll_deg / f_px / hfov_deg / K (4,) / inlier (N,, 1 = übernommen) /

n_inliers / n_frames / n_frames_with_candidates / residual_deg (Winkelresiduum-RMS der übernommenen Punkte) /

max_residual_deg / residual_px / loo_px (mittlerer Leave-1-out-Vorhersagefehler) / loo_max_px / span_h

(Zeitspanne der übernommenen Punkte) / n_hypotheses (Anzahl der Hypothesen, die das Vorwissen passiert haben) / at_prior_bound (1 = die Antwort klebt am Rand des Vorwissens: nicht vertrauen).

Raises:

ValueError: Kandidaten in weniger als 2 Frames, keine Hypothese passiert das Vorwissen, weniger als 3 Inlier.

Ausführlicher Anwendungsleitfaden

• Leitfaden zur Familie geocam

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.

• Der kanonische Algorithmus (Autor, Jahr) und seine Anwendungen stehen im Familienleitfaden oben.

Ausführbare Beispiele (verifizierte Samples, die diesen Operator wirklich aufrufen)

• poc_public_camera_heading_real — py -3.11 examples/poc_public_camera_heading_real.py

Typkompatible Folge-Operatoren (nehmen table als Eingabe)

render_skyline_view · camera_orientation_from_skyline

Gleiche Kategorie (sun)

sun_position · sun_pixel_position · camera_orientation_from_sun · sun_bloom_fit


*Provenance: geocam.py — GEOCAM 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.