單元 7 · ISP 管線深入

感測器內 ISP vs 平台

Orange Pi 的 ISP 現實

與 RPi5(硬體 ISP)不同,Orange Pi 的校正多半發生在感測器內部(OV5640 內建 AEC/AGC/AWB/DPC)。

SoC平台 ISP調校空間
RK3588Rockchip ISP較大(需 Rockchip 工具)
H618/H616多無完整 ISP小(靠感測器)

OV5640 內建校正 register 群

Register 群功能
0x3500–0x350FAEC/AGC(曝光與增益)
0x5180–0x51A5AWB(白平衡)
0x5000–0x5003ISP 功能開關(色彩/降噪)
觀念:感測器內 ISP「能用但有限」——出「還可以的圖」沒問題,但專業調校(LSC 網格、CCM 分段)需要平台 ISP(如 RK3588)。

7.3 深入原理:ISP 管線的每個階段在做什麼

無論感測器內 ISP 還是平台 ISP,校正幾乎都走同一條「經典管線」:

RAW黑位校正LSCDPCdemosaicAWBCCMgammaNR/sharpenYUV

OV5640 內建 ISP 把整條管線做在感測器內部,用 0x5000 一帶的開關控制各階段。每個階段的「校正空間」由對應 register 決定:

階段OV5640 register性質
黑位/OB0x4000 帶固定 offset 減除
LSC0x4600 帶有限的 shading 表
DPC0x4800 帶缺陷像素校正
AWB0x5180–0x51A5R/G/B gains
色彩矩陣0x4750 帶CCM
關鍵認知:「感測器內 ISP」的 register 通常只公開部分位元(其他欄位需 NDA)。本站教的是「概念與公開欄位」,正式量產調校需原廠工具與文件。

7.4 完整 Worked Example:切換感測器內 ISP 開關

步驟 1|查 ISP 功能開關
for r in 0x5000 0x5001 0x5002 0x5003; do
  echo -n "$r: "; sudo i2ctransfer -y 3 w2@0x3c ${r:2:2} ${r:4:2} r1
done
步驟 2|關閉色彩處理(看 RAW 化效果)
sudo i2ctransfer -y 3 w3@0x3c 0x50 0x00 0x00   # 0x5000 bit0 控制 ISP 總開關
步驟 3|取幀看差異
v4l2-ctl -d /dev/video0 --set-fmt-video=width=1280,height=720,pixelformat=YUYV \
  --stream-mmap=3 --stream-count=1 --stream-to=isp_off.yuv
紀律:先記下「原本值」再改——改壞立刻回寫。此實驗只為理解 ISP 開關的影響;正式流程走驅動,別把板卡留在手動改壞的狀態。

7.5 疑難排解決策樹:ISP 效果不如預期

現象方向
關 ISP 後全綠/全洋紅正常——RAW 沒 demosaic,顏色當然錯(別慌,這是「證明 ISP 在工作」的訊號)
色彩過飽和/色偏AWB/CCM 問題 → 回單元 11
角落暗LSC 沒開或表太小 → 單元 12
雜訊明顯NR 階段弱 → 單元 13
全無差別0x5000 開關對 YUYV 路徑無效 / 需重啟串流才生效
常見錯誤與陷阱:① 忘了「register 寫入後需重啟 streaming 才套用」;② 誤以為關 ISP 會出「乾淨 RAW」——出圖仍是 YUV,只是色彩處理被關掉;③ 在無平台 ISP 的板卡上苦等 ISP 節點——先確認你的 SoC 到底有沒有。

7.7 深入原理:感測器內 ISP vs 平台 ISP 的調校空間對照

「能調什麼」比「有沒有 ISP」更實用。用同一個校正任務比較感測器內 ISP 與平台 ISP:

任務感測器內(OV5640)平台 ISP(RK3588)後處理(OpenCV)
黑位0x4000 帶(固定 offset)OB 參數可分段減常數
LSC表極小、公開欄位少完整網格(如 17×13)任意大小增益圖 ✅
AWB0x5180 gains3A 引擎 + 分色溫策略後處理 gains ✅
CCM欄位多不公開完整矩陣 + 分區域OpenCV 矩陣 ✅
NR/Sharpen0x5000 帶(弱)硬體模組強演算法任意 ✅
即時性✅ 感測器內✅ 硬體管線⚠️ 視算力
重要陷阱:「感測器內 ISP 有 LSC」容易造成誤解——它存在但網格小、欄位多為 NDA,量產調校空間有限。真正的深度校正要靠平台 ISP 或後處理,別被 register 表格誤導。

7.8 練習:ISP 分工實作

  1. 0x5000–0x5003 開關實驗(7.4)驗證「哪一段由感測器做」,備份原始值並取幀對比。
  2. 在 RK3588(若有)上找出 rkisp 節點,列出它的輸出與 controls。
  3. 把「黑位 / LSC / AWB / CCM / NR」五項,填入你板卡的「誰來做」表。
  4. 說明「感測器有 LSC」與「可以深度調 LSC」的差別。
  5. 比較 OV5640 內建 ISP 與 RK3588 平台 ISP 的 LSC/AWB 校正空間差異。

7.9 進階真實情境 Worked Example:RK3588 ISP3 的 LSC 網格 vs 後處理增益圖

場景:在 Orange Pi 5 Plus(RK3588)上,用 OV5640 拍均勻亮場,分別用 ISP3 內建 LSC 與後處理 Python 增益圖做 lens shading 校正,比較效果。

步驟 1|用 ISP3 做 LSC(透過 Rockchip tuning 工具)
# 若有 rkisp tuning 工具:
rkisp_tuning -d /dev/media0 --set-lsc grid_17x13
# 用 ISP3 出圖
v4l2-ctl -d /dev/video0 --stream-mmap=3 --stream-count=1 --stream-to=isp_lsc.yuv
步驟 2|用後處理做 LSC(Python 增益圖)
python3 - <<'EOF'
import numpy as np
raw = np.fromfile('flat.raw', dtype=np.uint16).reshape(720, 1280)
center = raw[300:420, 500:780].mean()
gain = center / (raw.astype(float) + 1e-6)
np.save('gain.npy', gain)
corrected = (raw * gain).clip(0, 1023).astype(np.uint16)
corrected.tofile('post_lsc.raw')
EOF
設計決策:ISP3 的 LSC 是硬體管線內的即時處理(無 CPU 負擔),但網格固定且 tuning 工具封閉;後處理增益圖可在 RAW 上做任意大小網格,但非即時。選擇取決於「即時性需求 vs 調校彈性」。

7.10 深入原理擴充:RK3588 RGA 的 ISP 後段處理

RK3588 的 RGA 可以做 ISP 出圖後的即時處理,但它不在 media graph 內:

功能ISP3 做?RGA 做?後處理做?
RAW → YUV(demosaic)✅ 硬體❌ 不做⚠️ CPU 慢
旋轉 90°/270°❌ 不做✅ 硬體即時⚠️ CPU 慢
縮放❌ 不做✅ 硬體即時⚠️ CPU 慢
YUV → NV12✅ 可設定✅ 硬體即時⚠️ CPU 慢

容易忽略的邊界案例:RGA 的旋轉操作會改變圖像的 stride(bytesperline),但不會更新 V4L2 的 format metadata——所以旋轉後的 buffer 必須在 userspace 手動重新計算 layout,否則會出現條紋。

7.11 診斷式疑難排解表

症狀可能原因解決方案
關 ISP 後出圖仍是 YUV 而非 RAWOV5640 的 ISP 開關只影響色彩處理,不切換輸出格式0x3008 切到 raw output mode;或用 V4L2 format 設 SRGGB10
RK3588 ISP3 LSC 效果不如後處理ISP3 網格太粗或未 tuning用 Rockchip tuning 工具調整網格大小;或接受後處理更精準
OV5640 0x5000 設定後無變化需重啟 streaming 才套用STREAMOFF → 設定 → STREAMON
色彩過飽和但 AWB 看起來正常CCM 問題(非 AWB)用 ColorChecker 量 CCM;後處理補矩陣
ISP3 出圖延遲明顯ISP pipe 塞住或 DDR 頻寬不足降低解析度測試;確認 DDR 頻寬 DT 設定

7.12 進階挑戰題

  1. 在 RK3588 上,用 ISP3 做 LSC + AWB + CCM,再用後處理做同一套校正,比較兩者的 PSNR(峰值信噪比)差異。
  2. 0x5000 的 bit 開關逐個開啟/關閉 OV5640 的 ISP 模組(DPC/AWB/CCM),對同一場景取幀,記錄每開關對畫質的量化影響。
  3. 設計一個管線:OV5640 → ISP3 出 NV12 → RGA 旋轉 90° → MPP 編碼。測量端到端延遲,找出瓶頸在哪一段。

7.13 專案級 Worked Example:感測器端 vs 平台端 ISP 分工評估專案

把單元 7 的 ISP 知識做成架構評估專案:對你的應用需求,實測「感測器內 ISP」與「平台 ISP / 後處理」各能提供什麼,最後產出「誰來做什麼」的分工決定文件。

階段 1|測感測器端 ISP 能力(單元 7)
v4l2-ctl -d /dev/v4l-subdev0 --list-ctrls    # 看有哪些感測器端校正
for r in 0x5000 0x5180 0x4600; do
  echo -n "$r: "; sudo i2ctransfer -y 3 w2@0x3c ${r:2:2} ${r:4:2} r1
done
階段 2|測平台 ISP 能力(單元 4/9)
media-ctl -p -d /dev/media0 | grep -iE "isp|cif"    # 有無平台 ISP
v4l2-ctl -d /dev/v4l-subdev0 --list-ctrls | wc -l     # controls 數量 = 調校深度
階段 3|測後處理能力(單元 12/13)
python3 -c "import cv2; print('OpenCV', cv2.__version__)"
# 量後處理 LSC/NR 的延遲(單元 12 增益圖、單元 13 NR)
python3 - <<'EOF'
import cv2, time, numpy as np
img = np.random.randint(0,255,(720,1280,3), dtype=np.uint8)
t=time.time(); cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21)
print(f'OpenCV NR 延遲: {(time.time()-t)*1000:.0f} ms')
EOF
階段 4|產出分工表
# 範例輸出:
# 任務      感測器   平台ISP   後處理    決定
# 黑位      ✅0x4000  ✅OB      ✅      → 感測器
# LSC       ⚠️小表    ✅網格     ✅      → 平台/後處理
# AWB       ✅        ⚠️        ✅      → 感測器(簡單場景)
# CCM       ❌        ✅        ✅      → 後處理
# NR        ⚠️弱      ✅        ✅      → 後處理
專案完成標準:你有一份「ISP 分工決定文件」,對每個校正任務寫明「誰做、為何、用什麼參數」。這份文件就是你在這平台上的調校藍圖,也是日後升級平台時的對照依據。

7.14 量測/驗證 SOP:ISP 開關影響驗證

步驟作法通過判據
1. 備份原始值讀 0x5000–0x5003 全部欄位記錄原始值
2. 關單一功能改 0x5000 的對應 bitregister 變更成功
3. 重啟串流STREAMOFF → STREAMON新設定套用(7.5 提到需重啟)
4. 取幀比較開/關各取一幀肉眼與數值可見差異
5. 復原並確認寫回原始值回到基準狀態
SOP 紀律:每次實驗只動一個開關、先備份後修改、改完必復原。這套「單變數實驗法」是所有 ISP 驗證的共通骨架。

7.15 平台間對照:ISP 管線

面向Orange PiRPi5Orin NanoThor
平台 ISPRK3588 有 / H618 無硬體 ISPNVIDIA ISPNVIDIA ISP(新)
3A 引擎感測器內建為主libcamera IPANVIDIA 3ANVIDIA 3A
LSC 網格RK 工具 / 後處理libcamera tuningNVIDIA tuningNVIDIA tuning
調校文件BSP 資料(少)開源(完整)封閉(需簽約)封閉(新)
自訂彈性高(register 可直控)中(IPA 可改)低(封閉)低(封閉)
核心領悟:Orange Pi 的 ISP 彈性在「底層」——你能直接摸到 register;RPi5 在「開源 IPA」;NVIDIA 在「封閉但強」。選擇平台 = 選擇你想在哪一層工作。

7.16 互動式檢核清單:本單元進階驗收

checklist
- [ ] 我能完成 ISP 分工評估專案並產出分工表。
- [ ] 我能用 0x5000 開關實驗證明「哪一段由感測器做」。
- [ ] 我明白「感測器有 LSC」與「可深度調 LSC」的差別。
- [ ] 我已建立自己的「黑位/LSC/AWB/CCM/NR 誰來做」表。
- [ ] 我能說明 RPi5(開源)vs NVIDIA(封閉)的調校路徑差異。
- [ ] 我遵守「單變數實驗法」並保留每次實驗的備份。

7.17 Register 位元級完整工作流

ISP 管線的各階段都由 register 控制。以下是 OV5640 內建 ISP 的位元級操作序列:

步驟暫存器/位址位元欄位操作預期值
1. 開啟 ISP0x501F[0] ISP enablei2cset -y 3 0x3c 0x501f 0x01ISP 開啟
2. 開關 LSC0x5800[0] LSC enablei2cset -y 3 0x3c 0x5800 0x01/0x00LSC on/off
3. 開關 AWB0x5180~0x5190[0] AWB enablei2cset -y 3 0x3c 0x5183 0x01AWB on
4. 設定 AEC0x3503[0] AEC manuali2cset -y 3 0x3c 0x3503 0x08手動 AEC
5. 讀 AEC 結果0x3500~0x3502[19:8] exposurei2cget ... 0x3500依場景
6. 驗證 ISP 輸出v4l2-ctlv4l2-ctl --stream-mmap=1 --stream-count=1成功取流
位元級關鍵: 0x501F 是 OV5640 ISP 的「總開關」。關閉後感測器直出 RAW;開啟後經過 ISP 管線(LSC→AWB→CCM→gamma)。用這個 register 可以驗證「哪一段由感測器做」。

7.18 多層疑難排解決策樹

決策樹 A:ISP 開關實驗失敗

決策樹 A
i2cset 0x501F=0x01 後影像異常?
├─ 影像不變 → ISP 未生效
│  ├─ 檢查 0x501F 回讀值 → 是否寫入成功
│  └─ 檢查 sensor format → ISP 只在特定格式下運作
├─ 影像變差 → ISP 設定錯誤
│  ├─ 檢查 LSC/AWB/CCM 開關
│  └─ 嘗試只開 ISP 但關閉其他模組
└─ 影像變好 → 正常!記錄差異
   └─ 截圖對比:ISP on vs off

決策樹 B:感測器內 ISP vs 平台 ISP 混亂

決策樹 B
OV5640 的 ISP 幹什麼?
├─ 內建:AEC/AGC/AWB/LSC(0x501F 控制)
├─ 平台:RK3588 的 ISP(若有)
└─ 後處理:你的 Python 腳本(任意)
   └─ 關鍵:先在 RAW 上驗證(關閉 0x501F)

7.19 量測驗證完整 SOP

步驟指令預期輸出判讀標準
1. 關閉 ISPi2cset -y 3 0x3c 0x501f 0x00RAW 輸出感測器直出 RAW
2. 取 RAWv4l2-ctl --stream-mmap=1 --stream-count=1RAW 檔Bayer 格式正確
3. 開啟 ISPi2cset -y 3 0x3c 0x501f 0x01ISP 管線影像經過處理
4. 取 ISP 輸出v4l2-ctl --stream-mmap=1 --stream-count=1處理後影像對比 RAW 差異
5. 開關 LSCi2cset ... 0x5800 0x00LSC 關閉角落暗角出現
6. 驗證 AECi2cset ... 0x3503 0x08; i2cset ... 0x3500 0x00手動曝光可控制亮度

7.20 四平台終極對照

面向Orange PiRPi5Orin NanoThor推薦
ISP 硬體RK3588 有 / H618 無硬體 ISPNVIDIA ISPBlackwell ISP畫質→NVIDIA
ISP 開關0x501F(OV5640)libcamera tuning封閉封閉學習→0x501F
調校彈性最高(register 層)高(IPA 開源)低(封閉)低(封閉)學習→Orange Pi
校正路線感測器內建libcamera 3ANVIDIA 3ANVIDIA 3A底層→感測器
LSC/AWB/CCMOV5640 內建ISP 內建ISP 內建ISP 內建學習→OV5640

7.21 完整 Bring-up 專案 Checklist

checklist
- [ ] 產出「ISP 分工表」(哪一段由感測器/平台/後處理做)
- [ ] 用 0x501F 開關實驗證明「哪一段由感測器做」
- [ ] 用 0x5800 開關 LSC 並截圖對比
- [ ] 驗證 AEC 手動控制(0x3503=0x08)
- [ ] 關閉 ISP 取 RAW,開啟 ISP 取處理後影像
- [ ] 產出「三層校正能力表」(sensor/platform/post)
- [ ] 確認 OV5640 內建 AEC/AGC/AWB/LSC 的 register 群
- [ ] 比較 RK3588 與 H618 的 ISP 能力差異
- [ ] 遵守「單變數實驗法」並保留每次實驗備份
- [ ] 產出「ISP 管線實驗報告」
看完這單元你應該能說出:
  • Orange Pi 的 ISP 現實。
  • OV5640 內建 AEC/AGC/AWB register 群。
  • RK3588 vs H6xx 差異。
  • 感測器內 ISP 的優點與限制。
  • 經典 ISP 管線各階段與 register 對應。
  • 用 ISP 開關實驗驗證管線在哪一段。
  • 感測器/平台/後處理三層的調校空間對照。

延伸閱讀