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"))

사용법

프레임마다 여러 개 있는 '밝은 덩어리' 후보(태양·흰 차·표지·문자가 섞임)에서 시각대로 움직이는 1개를 RANSAC으로 골라, (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 이내에 후보가 있는 프레임 수(지평선 아래의 시각은 투표하지 않는다). 실사의 블룸 중심은 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 패밀리 가이드

참고(샘플 데이터·문헌)

• 샘플 데이터 카탈로그(DL URL / 라이선스) —— 2-D 는 skimage.data(BSD/public)+ 합성, 3-D 는 실데이터 소스(Stanford/PDS 등)의 DL 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 연산자 레지스트리. 이 op 노트는 tools/opdocs.py md 가 자동 생성합니다(직접 편집하지 마세요).*

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