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,只能觀測後者。

跳至章節
判斷層級Corridor/zoomStep/LDCDetection Type空 polygonPortal 契約

Detection Type 現在能不能畫?

這是一次 runtime 判斷,不是永久的 model capability 宣告。

  1. 1組成目前 requestmodel · height · tilt · zoomStep · LDC · corridor
  2. 2執行 calcFov3D取得 Human/Vehicle/Face/LPR/PPE/Fall polygons
  3. 3檢查 response[T]是否為 non-empty array?

YES:加入 available 並建立 polygon只代表目前組態 drawable

NO:本次不顯示該類型再分查產品能力、校正、SoC 與安裝幾何

IVSD Detection Type 可繪製判斷流程 以 model 與目前安裝組態呼叫 calcFov3D,逐類檢查回傳多邊形是否非空;非空才標為目前可繪製,空值則需再診斷產品能力、校正資料、SoC 與安裝幾何。 YES NO 要判斷 Detection Type T 能不能畫 CURRENT CONFIG 組成這次計算 request model · h · tilt · zoomStep · LDC · corridor RUNTIME OBSERVATION WASM calcFov3D 回傳六類各自的 ground polygon response[T] is non-empty array? DRAWABLE NOW 加入 available,建立 polygon NOT DRAWABLE NOW 這次不顯示該類型按鈕 DIAGNOSE 能力/校正/SoC/幾何需分開查 RULE · NON-EMPTY POLYGON MEANS DRAWABLE FOR THIS CONFIG — NOT A PERMANENT MODEL CAPABILITY CLAIM
01

先判斷:這是靜態能力,還是執行期結果?

Corridor、LDC、zoomStep 可在選定 model 時先解出;六類 Detection Type 則會隨安裝與模式改變,必須每次重算。

項目真正問題目前判斷來源何時重算
Corridor這個 model 是否允許開啟走廊模式?型號前綴規則。選定或切換 model。
LDC這個 model 是否有 LDC 專用校正資料?intrinsics_ldc.yml 是否存在。選定或切換 model。
zoomStep目前 focal/zoom ratio 對應哪一個校正狀態?Intrinsics 內的 ZoomValzoom_step[]focal、zoom ratio 或 LDC 改變。
六類 polygon這個組態現在畫不畫得出該類範圍?calcFov3D 對該類回傳的 polygon 是否非空。model、height、tilt、zoomStep、LDC、Corridor 改變。

從 Camera 看差別:四種 capability 改的是不同位置

它們雖然都出現在 Camera 設定旁,但不是同一類能力。Corridor 改安裝/呈現模式,zoomStep 指向變焦校正位置,LDC 切換成像校正路徑;Detection Type 則是目前組態計算後,哪些範圍真的畫得出來。

Camera 四種能力的視覺比較 四個並排面板分別說明 Corridor 改變畫面方向與計算模式、zoomStep 改變鏡頭的變焦校正位置、LDC 改變像素到視線的校正路徑,以及 Detection Type 表示目前組態回傳的可繪製偵測範圍。 01 · CORRIDOR 改畫面方向與計算模式 CAMERA VIEW NORMAL CORRIDOR CHANGES 顯示比例、H/V 與 WASM mode DOES NOT MEAN Camera 本體一定旋轉 或只把結果圖轉 90° 02 · ZOOMSTEP 選擇變焦校正位置 CAMERA VIEW 60 600 1140 1680 2220 CURRENT CALIBRATION CHANGES 鏡頭位置對應的 calibration AFFECTS K / D、mapping、current FOV 它不是 mm、百分比或 array index 03 · LDC 切換成像校正路徑 CAMERA VIEW NORMAL PATH LDC PATH CHANGES pixel → ray 使用的 calibration AFFECTS 影像形狀、有效 FOV、polygon 不是單純把角度修得更精準 04 · DETECTION TYPE 表示這次畫得出的範圍 CAMERA VIEW HUM VEH FAC LPR PPE FALL CHANGES calcFov3D 的 runtime response AFFECTS 可用控制項與地面 polygon 空結果不等於 model 永遠不支援 ONE CAMERA · FOUR DIFFERENT LAYERS 先分清「模式、校正位置、校正路徑、執行期輸出」,再判斷 UI 與重算時機。
同一台 Camera 可以同時涉及四種能力,但判斷方式不同:Corridor 看 model 規則,zoomStep 看變焦校正資料,LDC 看專用資產,Detection Type 則看這次 calcFov3D 回傳的 polygon 是否非空。
02

Corridor、zoomStep、LDC 各自代表什麼

三者都會進入 IVSD 計算 request,但一個是安裝模式、一個是校正階編號、一個是鏡頭畸變校正模式。

Installation mode

Corridor:允許把視野用在縱深長廊

corridorSupported 與使用者是否已開啟的 corridorMode 是兩個欄位。支援判斷是現行前端規則:

corridorSupported = model exists
AND NOT /^(FE|MS|MA|SC)/i.test(model)
  • FD9389IB9365:可開啟。
  • FE…MS…MA…SC…:不可開啟。
  • 預設 corridorMode=false;只有支援時才開放 UI 切換。

不能只當成把圖旋轉 90°:顯示比例與 H/V 會交換,但 corridorMode 也會傳入 WASM 重算 polygon;目前前端沒有可取代它的封閉公式。

Calibration state id

zoomStep:某一階鏡頭校正的識別值

它用來讓 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 correction

LDC: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 關閉與開啟的校正管線差別 LDC 關閉時使用一般 Intrinsics 與原始畸變 mapping;開啟時使用 LDC 專用 Intrinsics 與重投影 mapping,兩者分別送入預覽和偵測計算,產生可能不同的有效 FOV 與 polygon。 SAME MODEL · SAME HEIGHT / TILT / ZOOMSTEP COMPARE CALIBRATION PATH LDC OFFintrinsics.ymlgeneral calibration MAPPING原始 K / Ddistorted pixel ↔ ray PARALLEL CONSUMERSPreview + calcFov3DuseLdc = false BASELINE OUTPUT原始有效 FOV/polygonmodel-specific baseline LDC ONintrinsics_ldc.ymlLDC-specific calibration REPROJECTLDC K / D/可用 remapcorrected pixel ↔ ray PARALLEL CONSUMERSPreview + calcFov3DuseLdc = true RECOMPUTED OUTPUT有效 FOV/polygon 可能改變crop · stretch · ground range KEY POINTLDC 改的是 pixel mapping 與 calibration path;角度變化是結果,不是 LDC 的唯一目的。
LDC OFF/ON 應視為兩套校正管線。即使某些 model 的 Human 遠端沒有變化,也不能推論 mapping 完全相同;反之,部分 model 的偵測遠端可能明顯縮短。

ZoomStep:離散校正節點+節點間內插,SVD 只在部分 fallback 擬合 D

Intrinsics 只保存若干個已校正的 ZoomVal 節點;目前焦距先映射成 zoomStep,落在節點之間時,本地 fallback 會內插校正資料,再由完成後的投影模型計算 FOV。

ZoomStep、校正內插、SVD 與 FOV 的關係 焦距或倍率先轉成 zoomStep,再定位相鄰的 ZoomVal 校正節點並內插 K、D 或 distortion table;部分本地 fallback 使用 SVD 擬合畸變係數 D,最後才由投影矩陣或邊緣光線計算 FOV。 TABLE → D FALLBACK MAIN PATH · CURRENT FRONTEND / CALIBRATION MODELSVD DOES NOT SELECT AN ANGLE INPUTfocal 或 zoom ratiomm / declared ratio MAP轉成 zoomSteplinear map / exact ratio LOCATE找到相鄰 ZoomValA < target < B INTERPOLATE內插校正資料focal · table · K / D DERIVE FOV從完成的模型算角度ideal: P/K · edge: K+D raysnot selected by SVD LOCAL JS FALLBACKSVD 擬合 distortion Dleast-squares coefficients ORDER先取得或擬合 K/D,再算 FOV;SVD 解的是畸變模型係數,不是「哪個角度最好」。
主 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 mm1385 @ 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 與校正節點共同產生的近似,不是光學定律。

03

Human、Vehicle、Face、LPR、PPE、Fall 怎麼知道能不能畫

現行前端沒有一張 model → Detection Type 對照表。它呼叫 WASM 後,逐類檢查回傳陣列;非空才加入該 Camera 的 available 集合。

1
每次重算先清空 available

避免 model 或安裝條件改變後,舊 polygon 仍被誤認為可用。

2
執行 calcFov3D

輸入 model、height、tilt、zoomStep、LDC 與 Corridor。

3
逐類檢查非空陣列

fovRangeHumanfovRangeVehiclefovRangeFacefovRangeLicensePlatefovRangePPEfovRangeFall

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 行為。
05

Portal 整合時建議保留兩層 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 支援」。