camera_orientation_from_sun_candidates — GEOCAM sun op

• 資料種類:keypoints × signal × signal → table

• 呼叫: 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)(要直接呼叫實作,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);從台帳取用則 opsgeocam.get("camera_orientation_from_sun_candidates"))

用法

從每個影格中多個「亮團塊」候選(混有太陽、白色汽車、標誌、文字)中,以 RANSAC 選出依時刻規律運動的 1 條,同時決定 (yaw, pitch, roll) 與焦距 → table。固定相機中只有太陽以太陽的速度運動, 因此不憑外觀、而憑運動來認定太陽(在 Fintraffic 天氣相機上,基於外觀的門檻曾 24/24 誤檢,2026-09-21)。

假設 = 從時刻差 ≥ min_dt 的 2 影格中各取 1 個候選 → 與 camera_orientation_from_sun 相同的 Wahba 2 點解。不滿足道路相機先驗知識(|roll| ≤ roll_max_deg,pitch 在 pitch_range_deg 內,水平視角在 hfov_range_deg 內)的假設會被捨棄 —— 相對於自由度 4(旋轉 3 + 焦距)而候選過多時,偶然的 3 點會讓非物理的位姿通過。票數 = 在預測位置 tol_px 以內有候選的影格數(地平線以下的時刻不投票)。實拍的光暈(bloom)中心會抖動 5~13 px(雲、曝光),所以預設 20 px。用最佳假設的內點把焦距做 1 維最佳化,並用全部點重新擬合旋轉(2 次)。

濕路面上映出的太陽反射也以太陽的速度移動(鏡像),所以僅憑運動無法區分。反射位於影像下側(路面), 因此把它當作太陽擬合就會得到「相機朝上」的位姿(pitch > 0)—— 預設 pitch_range_deg 的上限 0 就是為此設的門檻(道路相機不會朝上)。若是朝上的相機請放寬。也建議做獨立的驗算(車道消失點的仰角 ≈ 0)。

傳入 K 時就用它(不搜尋焦距)。K=None 時主點為影像中心,把 fx = fy = f 在 hfov_range_deg 的範圍內搜尋 —— 公開相機通常沒有內部參數。

Args:

candidates: (N, 2) 的 (u, v)。把全部影格的候選堆疊而成(sun_bloom_fit 或 sun_pixel_position 的輸出)。

frame_index: (N,) 各候選屬於哪一影格(unix_times 的索引,整數值)。

unix_times: (F,) 各影格的 UNIX 秒(UTC)。

lat_deg, lon_deg: 相機的位置。

shape: (H, W)。

K: (fx, fy, cx, cy) 或 None。

Returns:

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

n_inliers / n_frames / n_frames_with_candidates / residual_deg(採用點的角度殘差 RMS)/

max_residual_deg / residual_px / loo_px(留 1 法預測誤差的平均)/ loo_max_px / span_h

(採用點的時間跨度)/ n_hypotheses(通過先驗知識的假設數)/ at_prior_bound(1 = 答案貼在先驗知識的邊緣:不可信)。

Raises:

ValueError: 候選少於 2 影格、沒有通過先驗知識的假設、內點少於 3。

詳細使用指南

• geocam 族使用指南

參考(範例資料、文獻)

• 範例資料目錄(下載 URL / 授權) —— 2-D 用 skimage.data(BSD/公有領域)加合成圖,3-D 給出真實資料源(Stanford/PDS 等)的下載 URL。

• 運算子來歷與參考文獻 —— 該運算子族所依據的研究/方法出處。

• 演算法的正典(作者、年份)與用途見上面的族使用指南。

可執行的範例(實際呼叫該運算子並已驗證的樣例)

• poc_public_camera_heading_real — py -3.11 examples/poc_public_camera_heading_real.py

型別可銜接的下一個運算子(可接受 table 作為輸入)

render_skyline_view · camera_orientation_from_skyline

同類別(sun)

sun_position · sun_pixel_position · camera_orientation_from_sun · sun_bloom_fit


*Provenance: geocam.py — GEOCAM 運算子登記表。本條目由 tools/opdocs.py md 自動產生(請勿手動編輯)。*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.