Current H/V FOV:資料分流與計算
FOV decision目的:取得這個 Channel 在目前焦距下真正交給後續地面投影使用的水平與垂直視角。
先判斷 focal 與該軸 FOV spec 的組合
| Focal input | 該軸 FOV input | Current FOV 行為 |
|---|---|---|
| scalar | scalar | 直接使用型錄提供的單一 FOV。 |
| scalar | undefined | 以 Sensor dimension+目前 focal 使用 pinhole 公式推算。 |
| [fMin, fMax] | [wide, tele] | 以 pinhole 為基礎,混合 wide/tele 兩端的型錄差值。 |
| [fMin, fMax] | undefined | 以目前 focal 使用 pinhole 公式推算。 |
不完整端點不是支援契約:Varifocal 若只提供單一 FOV 端點,product transform 會產生 scalar;現行水平計算忽略該 scalar 並退回 pinhole,垂直計算卻直接採用 scalar。這是 H/V 不一致的相容行為;跨系統契約應要求每一軸「兩端皆有」或「兩端皆無」。
Fisheye 例外:水平 FOV 在 tilt 0°/90° 會優先回傳 180°/360°,不走上表的一般分流;詳見第 05 節。
公式符號與來源
| 符號 | 代表內容 | 來源 |
|---|---|---|
| S | 該軸使用的 Sensor 尺寸;水平用 width,垂直用 height。 | Camera product spec |
| f | 這個 Channel 的目前焦距。 | 第 02 節的 currentFocalMm |
| fMin / fMax | wide 端與 tele 端的焦距。 | focalLengthMin / Max |
| FOVwide / FOVtele | 原廠提供的 wide/tele 視角;數值分別來自 FOV Max/Min。 | 該軸的 FOV product spec |
| θpinhole | 由 Sensor 尺寸與焦距推算的理論針孔視角。 | 本步驟計算值 |
| ε | 避免 focal range 為 0 時除以 0的極小正數。 | 計算保護值 |
Case A · 沒有 H/V FOV:使用 pinhole
currentFovH = θpinhole(sensorWidth, currentFocal)
currentFovV = θpinhole(sensorHeight, currentFocal)
怎麼讀:Sensor 越大,視角越大;焦距越長,視角越小。這是 ideal pinhole FOV,不保證完全等於原廠鏡頭的實測值。
Case B · 有 wide/tele FOV:分三步修正
Step 1 · 目前焦距位於 zoom range 的哪裡
/ max(fmax − fmin, ε)
z = 0 → wide 端 z = 1 → tele 端
Step 2 · 計算型錄端點與 pinhole 端點的差值
teleCorrection = FOVtele − θpinhole(S,fmax)
Step 3 · 把兩端修正量加回目前的 pinhole FOV
teleWeight = 1 − wideWeight
currentAxisFov = θpinhole(S,f)
+ wideCorrection × wideWeight
+ teleCorrection × teleWeight
本步輸出
逐軸判斷:水平與垂直分開判斷;某一軸完全缺少 FOV spec 時,只有該軸退回對應 sensor dimension+current focal。
與 PTZ 的關係:Portal 目前以 isVariFocal 將一般 Vari-focal 與 PTZ Optical Zoom 收斂到同一路徑;這裡只依目前焦距重算 current FOV,不處理 Pan 或 Tilt。