IVSD camera simulator · capability judgment
Corridor、Zoom Step、LDC 與 Detection Type 怎麼判斷
這頁回答的是「載入一個 Camera model 後,portal 應該開放哪些控制,以及目前組態能畫出哪些偵測範圍」。前三者可由型號規則或校正檔靜態判斷;Human、Vehicle、Face、LPR、PPE、Fall 則必須看本次 WASM 回傳。
先分清楚兩個問題:產品規格宣告「這個 model 有某項分析功能」,不等於目前的 height/tilt/zoomStep/LDC/Corridor 組合「畫得出有效 polygon」。現有 simulator 沒有產品 feature matrix,只能觀測後者。
跳至章節
Detection Type 現在能不能畫?
這是一次 runtime 判斷,不是永久的 model capability 宣告。
- 1組成目前 requestmodel · height · tilt · zoomStep · LDC · corridor
- 2執行 calcFov3D取得 Human/Vehicle/Face/LPR/PPE/Fall polygons
- 3檢查 response[T]是否為 non-empty array?
YES:加入 available 並建立 polygon只代表目前組態 drawable
NO:本次不顯示該類型再分查產品能力、校正、SoC 與安裝幾何
01先判斷:這是靜態能力,還是執行期結果?
Corridor、LDC、zoomStep 可在選定 model 時先解出;六類 Detection Type 則會隨安裝與模式改變,必須每次重算。
| 項目 | 真正問題 | 目前判斷來源 | 何時重算 |
| Corridor | 這個 model 是否允許開啟走廊模式? | 型號前綴規則。 | 選定或切換 model。 |
| LDC | 這個 model 是否有 LDC 專用校正資料? | intrinsics_ldc.yml 是否存在。 | 選定或切換 model。 |
| zoomStep | 目前 focal/zoom ratio 對應哪一個校正狀態? | Intrinsics 內的 ZoomVal 或 zoom_step[]。 | focal、zoom ratio 或 LDC 改變。 |
| 六類 polygon | 這個組態現在畫不畫得出該類範圍? | calcFov3D 對該類回傳的 polygon 是否非空。 | model、height、tilt、zoomStep、LDC、Corridor 改變。 |
從 Camera 看差別:四種 capability 改的是不同位置
它們雖然都出現在 Camera 設定旁,但不是同一類能力。Corridor 改安裝/呈現模式,zoomStep 指向變焦校正位置,LDC 切換成像校正路徑;Detection Type 則是目前組態計算後,哪些範圍真的畫得出來。
同一台 Camera 可以同時涉及四種能力,但判斷方式不同:Corridor 看 model 規則,zoomStep 看變焦校正資料,LDC 看專用資產,Detection Type 則看這次 calcFov3D 回傳的 polygon 是否非空。
02Corridor、zoomStep、LDC 各自代表什麼
三者都會進入 IVSD 計算 request,但一個是安裝模式、一個是校正階編號、一個是鏡頭畸變校正模式。
Installation modeCorridor:允許把視野用在縱深長廊
corridorSupported 與使用者是否已開啟的 corridorMode 是兩個欄位。支援判斷是現行前端規則:
corridorSupported = model exists
AND NOT /^(FE|MS|MA|SC)/i.test(model)
FD9389、IB9365:可開啟。FE…、MS…、MA…、SC…:不可開啟。- 預設
corridorMode=false;只有支援時才開放 UI 切換。
不能只當成把圖旋轉 90°:顯示比例與 H/V 會交換,但 corridorMode 也會傳入 WASM 重算 polygon;目前前端沒有可取代它的封閉公式。
Calibration state idzoomStep:某一階鏡頭校正的識別值
它用來讓 Intrinsics、displacement 與 calcFov3D 選到同一個變焦校正狀態。它不是 mm、倍率、陣列 index,也不是 0–100 的百分比。
focal → zoomStep:
round((clamp(f,minF,maxF)−minF)
× (maxStep−minStep)/(maxF−minF) + minStep)
zoom ratio → zoomStep:
find item where item.zoomRatio === selectedRatio
minFocal/maxFocal 來自 model attribute。minStep/maxStep 取目前 Intrinsics 清單首尾的 ZoomVal。- 資料不足、焦距範圍無效或 ratio 沒精確命中時,現行 fallback 是
0。
Lens distortion correctionLDC:Lens Distortion Correction
它表示使用 LDC 專用校正狀態,不是「這顆鏡頭有沒有 distortion」。現行 simulator 的支援判斷不是產品名稱,而是校正資產是否存在:
LDCSupported = model file list
contains /intrinsics_ldc\.yml$/i
default ldcEnabled = LDCSupported
- 關閉時讀
intrinsics.yml;開啟時讀 intrinsics_ldc.yml。 - LDC 不要求 zoomStep 精確命中節點;本地 fallback 在兩個 LDC 節點之間時會內插 LDC calibration。
- 預覽用對應 K/D 或 distortion table;偵測 request 同時傳
useLdc。 - 不同 model 開啟 LDC 後的 polygon 可能不變,也可能大幅縮短,不能套一條通用倍率。
Gate:沒有 intrinsics_ldc.yml 就不應讓 UI 傳 ldc=true;目前觀察此組合可能讓六類結果全部變空。找不到精確 LDC 節點時,也不應靜默改讀一般 intrinsics.yml。
Relationship三個欄位如何一起工作
它們最後不是各自畫 shape,而是共同決定載入哪組校正與 WASM 用哪種計算狀態;預覽與偵測仍是兩條平行管線。
model + heightCm + tiltDeg
+ zoomStep + useLdc + corridorMode
├─ buildDisplacementMap(...) · preview
└─ calcFov3D(...) · detection
- 切換 LDC 時,focal 應對到 LDC 檔內的 zoom step 範圍。
- 切換 Corridor 或 LDC 後,不能沿用上一組 Detection polygon。
- 任何一項變更後,都應重新建立
available 集合。
LDC OFF/ON:差別是整組 calibration path,不是角度 correction
LDC 會選擇另一組校正資產,重新建立 pixel 到視線的 mapping;有效 FOV 與偵測 polygon 是否改變、改變多少,取決於該 model 的校正資料。
LDC OFF/ON 應視為兩套校正管線。即使某些 model 的 Human 遠端沒有變化,也不能推論 mapping 完全相同;反之,部分 model 的偵測遠端可能明顯縮短。
ZoomStep:離散校正節點+節點間內插,SVD 只在部分 fallback 擬合 D
Intrinsics 只保存若干個已校正的 ZoomVal 節點;目前焦距先映射成 zoomStep,落在節點之間時,本地 fallback 會內插校正資料,再由完成後的投影模型計算 FOV。
主 WASM 路徑由 buildDisplacementMap 接收 zoomStep 並回傳 fx/fy/idealFovx/y;圖中的 SVD 是目前 repository 可確認的本地 JS fallback 行為,不應推論為 WASM 每次計算 FOV 都會執行的步驟。
具體例子:IB9365-EHTV-v2 的 4–9 mm 焦段
「焦段」是鏡頭可調整的 focal length 範圍。本例用同一個 current focal=6.5 mm,觀察它如何映射成 zoomStep,以及 LDC OFF/ON 為什麼會走不同的校正節點。
model · IB9365-EHTV-v2focal range · 4–9 mmcurrent focal · 6.5 mmimage · 1920×1080LDC calibration · available
Step 1 · focal 映射成 zoomStep
先以 model attribute 的焦段端點,對應 Intrinsics 的 zoomStep 端點。這一步只決定目前位於變焦軸的哪個位置。
minFocal=4 · maxFocal=9
minStep=60 · maxStep=2220
zoomStep = round((6.5−4) × (2220−60)/(9−4) + 60)
= 1140
LDC OFF · 落在兩個節點之間
intrinsics.yml 沒有 1140;相鄰節點是 948 @ 6 mm 與 1385 @ 7 mm,因此本地 fallback 會內插 distortion table。
weightA = (1385−1140)/(1385−948) ≈ 0.561
weightB = 1−weightA ≈ 0.439
interpolated focal ≈ 6×0.561 + 7×0.439
≈ 6.44 mm
若需要由內插後的 distortion table 建立 D,本地 JS 才會用 SVD 擬合 distortion coefficients;完成 K/D 後再算 FOV。
LDC ON · 本例剛好命中節點
intrinsics_ldc.yml 的節點是 60, 600, 1140, 1680, 2220;本例的 1140 精確命中第三個節點。這只是案例結果,不是啟用 LDC 的必要條件。
target zoomStep = 1140
matched ZoomVal_3 = 1140
→ directly use camera_matrix_3
→ directly use distortion_coefficients_3
→ derive preview FOV / detection polygon
若 target 改成 1000,本地 fallback 會在 LDC 節點 600 與 1140 之間內插;仍使用 intrinsics_ldc.yml,不會因為沒有精確命中就切回一般校正。本例命中 1140,因此不需要內插或用 SVD 從 table 擬合 D。
為什麼 OFF 內插得到約 6.44 mm,不是輸入的 6.5 mm?因為現行 focal→zoomStep 使用整段端點線性映射,而一般 Intrinsics 內部各 ZoomVal 與 focal 節點並非完全等距;兩個 mapping 不是精確反函數。這是目前 adapter 與校正節點共同產生的近似,不是光學定律。
03Human、Vehicle、Face、LPR、PPE、Fall 怎麼知道能不能畫
現行前端沒有一張 model → Detection Type 對照表。它呼叫 WASM 後,逐類檢查回傳陣列;非空才加入該 Camera 的 available 集合。
1每次重算先清空 available避免 model 或安裝條件改變後,舊 polygon 仍被誤認為可用。
2執行 calcFov3D輸入 model、height、tilt、zoomStep、LDC 與 Corridor。
3逐類檢查非空陣列fovRangeHuman、fovRangeVehicle、fovRangeFace、fovRangeLicensePlate、fovRangePPE、fovRangeFall。
4非空才建立 shape 與按鈕available 決定能不能選;selected 只控制使用者目前想不想看到,兩者不要混用。
Human
目前觀察主要由可見地面幾何決定;通常是最穩定的類型。
Geometry
Vehicle
目前觀察主要由地面幾何決定;部分特殊 model gate 仍可能使它為空。
Geometry
Face
除了幾何,也受 SoC 對應的分析解析度與像素密度影響。
Geometry × resolution
LPR
LicensePlate 的 UI 簡稱;同樣是幾何與分析解析度共同限制。
Geometry × resolution
PPE
在 FOV simulator 中是獨立範圍,不應直接沿用 Human polygon。
Geometry × resolution
Fall
本 repository 搭配的 WASM build 掃描結果始終為空;管線存在,但不能據此宣告 Portal 已可用。EC2 native 7.16 另有 Fall 計算與繪製路徑,正式整合仍須確認採用版本與 capability 來源。
local WASM · 0 / 5280
drawableNow(T, config) = Array.isArray(response[T]) AND response[T].length > 0
available[cameraId] = { T | drawableNow(T, currentConfig) }
空陣列不能直接翻譯成「model 不支援」:它也可能表示缺 Intrinsics、SoC 無法辨識、分析解析度不足,或目前高度/tilt/zoom/模式下沒有有效區域。
04為什麼 polygon 會是空的
以下是目前 binary 與受控測試觀察到的 gate,用來診斷,不應冒充 IVSD 的正式產品規格。
| Gate | 目前觀察 | 影響 | 可信度 |
| 特殊型號名稱 | 名稱含大小寫敏感的 SC 子字串。 | 目前 build 只留下 Human。 | WASM 實測。 |
| SoC 無法辨識 | conf.d/model 缺失或字串不在 binary 的已知清單。 | 六類全部為空。 | WASM 實測。 |
| 分析解析度 | SoC 選到的 alg resolution 不足。 | Face、LPR、PPE 可能為空或遠端縮短。 | WASM 實測。 |
| 安裝幾何 | 目前 height、tilt、zoomStep、LDC、Corridor 下沒有通過逐點條件的地面區域。 | 個別類型變空。 | WASM 實測;門檻未公開。 |
| Fall producer | 本 repository 的 WASM build 掃描 5280 組組態皆為空;EC2 native 7.16 則存在獨立 Fall 計算與繪製路徑。 | 不可只依欄位或面板判斷;須以正式 runtime、版本及 capability 契約決定是否開放。 | 兩個 build 的實作觀察,待 IVSD 確認 production 行為。 |
05Portal 整合時建議保留兩層 capability
如果只存一個 supported boolean,會無法區分「產品沒有功能」與「功能存在,但目前條件畫不出範圍」。
Declared capability
來自正式產品 catalog/API,回答 firmware 或授權是否提供 Human、LPR、PPE 等功能。這是 model 層級、相對穩定的資料。
declaredTypes: Set<DetectionType>
Drawable capability
來自本次 calcFov3D 回傳,回答目前安裝與校正條件是否有有效 polygon。這是 placement/config 層級的暫態資料。
drawableTypes: Set<DetectionType>
visibleOptions = declaredTypes ∩ drawableTypes
若暫時沒有產品 catalog:UI 可以先使用 drawableTypes,但文案應寫「目前可繪製」,不要寫成「此 model 支援」。