單元 15 · 四平台影像調校功能比較

Orange Pi 視角

Orange Pi 在四平台中的位置

項目RPi5Orange PiOrin NanoThor T5000
ISP 形態SoC 硬體 ISP感測器內建為主NVIDIA ISPBlackwell+Holoscan
AE/AWBlibcamera ✅sensor ⚠️NVIDIA ✅✅NVIDIA ✅✅
LSC⚠️ 後處理
NR/Sharpen⚠️ 後處理✅✅✅✅
HDR⚠️ 依驅動✅✅
工具鏈開源V4L2 陽春開放封閉強
Orange Pi 定位:調校功能最弱,但「最貼近 Linux 底層」——適合想徹底理解感測器 register 的工程師;追求畫質時升級 RPi5 / NVIDIA。

15.2 對同一顆 OV 感測器的操作差異

面向RPi5Orange PiOrin NanoThor
感測器控制libcameraV4L2 subdevtegracam/Argustegracam/Holoscan
曝光ExposureTimeexposureSensorMode exp_timeSensorMode
白平衡ColourGainsred/blue_balanceArgus AWBArgus AWB
RAWrpicam --rawv4l2-ctlargus rawargus/Holoscan
核心領悟:四平台做的是同一件事,只是介面不同——本課建立的原理與流程可 100% 平移。

15.3 感測器 register 層的共通性

無論平台,OV 感測器 register(0x300A ID、0x3500 曝光、0x350A 增益)相同——平台差異只在「誰幫你寫」。

四平台讀同一個 register(0x300A)
RPi5:      i2ctransfer -y 22 w2@0x36 0x30 0x0a r1
Orange Pi: i2ctransfer -y 3  w2@0x3c 0x30 0x0a r1
Orin/Thor: i2ctransfer -y 0  w2@0x36 0x30 0x0a r1

15.4 深入:對同一顆 OV5640 的四平台操作

下表再把「四平台操作」從介面層收斂到 register 層,方便直接對照:

面向RPi5Orange PiOrin NanoThor
感測器控制libcameraV4L2 subdevtegracam/Argustegracam/Holoscan
曝光ExposureTimeexposureSensorMode exp_timeSensorMode
白平衡ColourGainsred/blue_balanceArgus AWBArgus AWB
RAWrpicam --rawv4l2-ctlargus rawargus/Holoscan
核心領悟:register 相同、概念相同、流程相同;變的只有介面。

15.5 深入原理:為什麼 register 相同而介面不同

四平台面對「同一顆感測器」時,硬體 register 完全相同——差異在抽象層。這源自各自的「控制模型」:

平台控制模型抽象層誰寫 register
RPi5libcamera + 平台 ISP高(3A 全自動)libcamera IPA
Orange PiV4L2 subdev低(直接 controls)使用者/驅動
Orin Nanotegracam + Argus高(封閉)NVIDIA 驅動
Thor T5000Holoscan + Argus最高(新)NVIDIA 驅動

調校可攜性的關鍵:你在 Orange Pi 學到的「曝光三要素順序」「灰卡 AWB」「RAW 驗證」是感測器物理,與介面無關——搬到任何平台都成立。介面差異只是「怎麼把意圖翻譯成 register」。

選擇建議:想徹底懂感測器 → Orange Pi(最低抽象);要快速量產畫質 → RPi5/NVIDIA;要在雲端管理多機 → Thor/Holoscan。

15.6 完整 Worked Example:同一任務的四平台對照

任務:「把曝光鎖在固定值、關自動白平衡、取一幀 RAW」。

RPi5(libcamera)
rpicam-still -o shot.jpg --immediate --raw --shutter 2000 \
  --awbgains 1.4,1.1 --gain 1.0
Orange Pi(V4L2)
v4l2-ctl -d /dev/v4l-subdev0 -c auto_exposure=0 -c exposure=2000 \
  -c auto_n_white_balance=0 -c red_balance=140 -c blue_balance=110
v4l2-ctl -d /dev/video0 --set-fmt-video=pixelformat=SRGGB10 \
  --stream-mmap=3 --stream-count=1 --stream-to=shot.raw
Orin Nano(Argus)
# argus_camera / libargus API 設定 SensorMode exp_time + AWB off
gst-launch-1.0 nvarguscamerasrc sensor-id=0 ! 'video/x-raw(memory:NVMM)' ! fakesink
Thor(Holoscan)
# Holoscan SDK 的 GXF/operator 配置 sensor mode 與 AWB 設定
完成標準:你能對同一任務在四平台「各寫出一行等效設定」,並說出每個參數對應到感測器 register(0x3500 曝光 / 0x5180 AWB)的關係。

15.7 疑難排解決策樹:跨平台移植踩雷

現象方向
曝光值單位不同各平台單位(µs/line/倍數)不同 → 對照 datasheet 轉換
gain 定義不同有的 1.0 基數、有的 0dB 基準 → 查 control 說明
AWB 沒關就手動設auto 優先 → 先關 auto 再設手動
RAW 格式名稱不同fourcc/名稱各平台異 → 統一用位元深 + order 描述
節點編號不同sensor-id / /dev/videoN 對應不同 → 先列 devices
常見錯誤與陷阱:① 直接照搬另一個平台的數值(單位沒換);② 以為「gains 1.4,1.1」在 Orange Pi 也是同一意義——OV 用無號整數(如 128=1.0×);③ 忽略平台 3A 引擎仍在跑——必須全部關閉才有可比性。

15.8 練習

  1. 完成「鎖曝光、關 AWB、取 RAW」的四平台等效指令表。
  2. 把 Orange Pi 的 exposure=2000 換算成 µs(查 OV5640 1-line 週期),再對照 RPi5 的 shutter 單位。
  3. 說明「感測器物理可攜、介面不可攜」並舉兩個例子。
  4. 若你有第二平台,實際跑一次相同任務比較結果。

15.9 回顧練習

  1. 列出「讀 sensor ID」在四平台的指令。
  2. 說明 register 相同而介面不同的原因。

15.10 進階真實情境 Worked Example:同一曝光任務的四平台 register 級追蹤

場景:在四個平台上分別把 OV5640 曝光鎖在 2000 lines,從使用者 API 追蹤到最終 register 寫入。

RPi5(libcamera)
rpicam-still -o shot.jpg --immediate --shutter 2000
# libcamera → IPA → I2C → 0x3501=0x07, 0x3502=0xD0
Orange Pi(V4L2)
v4l2-ctl -d /dev/v4l-subdev0 -c exposure=2000
# V4L2 subdev → ov5640 driver → I2C → 0x3501=0x07, 0x3502=0xD0
Orin Nano(Argus)
# Argus API → sensor_mode.exp_time=2000 → tegracam → I2C
Thor(Holoscan)
# Holoscan operator → GXF → sensor mode → I2C
設計決策:四平台的 API 差異在抽象層,但最終都寫到同一個感測器 register。這就是「原理可攜、介面不可攜」的具體例證——在 Orange Pi 學到的 register 級知識,搬到任何平台都成立。

15.11 深入原理擴充:各平台的 I2C bus 編號差異

平台I2C bus(OV5640)I2C 位址速率
RPi5bus 22(CSI0)0x3c100kHz
Orange Pi 5bus 3(CSI0)0x3c100kHz
Orin Nanobus 0(CSI0)0x36400kHz
Thor T5000bus 0(CSI0)0x36400kHz

容易忽略的邊界案例:Orin/Thor 的 OV 感測器位址是 0x36(不是 0x3c),這是因為 NVIDIA 平台的 OV 模組用不同的 address strap。如果你把 Orange Pi 的 i2cget 指令(0x3c)直接在 Orin 上跑,會讀不到 ID——必須先用 i2cdetect 確認實際位址。

15.12 診斷式疑難排解表

症狀可能原因解決方案
Orange Pi 的 exposure=2000 與 RPi5 的 shutter=2000 結果不同單位不同(line vs µs)查 OV5640 datasheet:1 line ≈ 29.6 µs(1080p@30fps)
RPi5 的 awbgains=1.4,1.1 在 Orange Pi 上無效OV 用無號整數 gains,RPi 用浮點比值Orange Pi 用 red_balance=140(無號整數)
Orin 上 0x3c 讀不到 IDOrin 的 OV 模組位址是 0x36改用 i2cdetect 掃 bus 0 找實際位址
跨平台移植後格式名不同fourcc 命名差異統一用「位元深 + Bayer order」描述(如 SRGGB10)
libcamera 的 ExposureTime 設定後 OV5640 不變libcamera 需要 IPA 模組且 auto 仍開先關 auto exposure,再設 ExposureTime

15.13 進階挑戰題

  1. 在四平台上各讀 OV5640 的 register 0x3500–0x3503(曝光值),用 Python 組合成 20-bit 值,比較四平台的 I2C 速率差異(量測讀寫時間)。
  2. 設計一個「跨平台曝光轉換表」:把 Orange Pi 的 exposure=2000 lines 換算成 µs,再對照 RPi5 的 shutter 值,驗證一致性。
  3. 在有第二平台的情況下,用同一顆 OV5640 模組分別接兩平台,比較「相同曝光設定」下的實際亮度差異(可能因 ISP 前端處理不同)。

15.14 專案級 Worked Example:跨平台移植對照專案

把單元 15 的跨平台知識做成完整的移植對照專案:選定一個調校任務(如「鎖曝光 2000、關 AWB、取 RAW」),在 Orange Pi 建立基準結果,再對照 RPi5 / NVIDIA 寫出等效設定並驗證。產出一份「移植對照文件」。

階段 1|在 Orange Pi 建立基準(單元 10/11)
v4l2-ctl -d /dev/v4l-subdev0 -c auto_exposure=0 -c exposure=2000 \
  -c auto_n_white_balance=0 -c red_balance=140 -c blue_balance=110
v4l2-ctl -d /dev/video0 --set-fmt-video=pixelformat=SRGGB10 \
  --stream-mmap=3 --stream-count=1 --stream-to=baseline.raw
ls -l baseline.raw   # 記錄 sizeimage 與亮度基準
階段 2|寫出四平台等效設定
# Orange Pi(V4L2)
v4l2-ctl -d /dev/v4l-subdev0 -c exposure=2000 -c auto_exposure=0
# RPi5(libcamera): shutter 2000µs + awbgains 固定
rpicam-still -o shot.jpg --shutter 2000 --awbgains 1.4,1.1 --gain 1.0
# Orin Nano(Argus): SensorMode exp_time + AWB off
# Thor(Holoscan): sensor mode 參數設定
階段 3|建立單位轉換表(單元 15.12)
python3 - <<'EOF'
row_us = 29.6    # OV5640 1080p@30fps 的 1-line 週期(µs)
exposure_lines = 2000
exposure_us = exposure_lines * row_us
print(f'Orange Pi exposure=2000 lines → {exposure_us:.0f} µs = RPi5 shutter')
# gains: Orange Pi 整數 128=1.0×,RPi5 浮點 1.0×
red_ratio = 140/128
print(f'red_balance=140 → {red_ratio:.2f}× (RPi5 的 ColourGains R)')
EOF
階段 4|產出移植對照文件
# 移植對照.md 範例結構:
# 任務 | Orange Pi | RPi5 | Orin | Thor | 單位/備註
# 曝光 | exposure=2000 | shutter=59000µs | exp_time=59000 | 同上 | 2000×29.6µs
# AWB  | red=140 blue=110 | awbgains 1.4,1.1 | AWB off+gains | 同上 | 128=1.0×
# RAW  | v4l2-ctl SRGGB10 | rpicam --raw | argus raw | capture | 同 10-bit
專案完成標準:你有一份「移植對照文件」,把核心任務在四平台的設定、單位、轉換公式寫清楚。任何團隊成員換平台時,照表操作即可——這是跨平台專案的標準資產。

15.15 量測/驗證 SOP:跨平台等效性驗收

步驟作法通過判據
1. 建立基準Orange Pi 上完成任務並記錄結果基準 RAW 與參數記錄
2. 寫等效設定換算單位(lines↔µs、整數↔浮點)換算公式正確
3. 執行比較第二平台跑相同任務亮度/格式接近基準
4. 讀 register 驗證兩平台都 i2cget 0x3501/0x3502register 值一致(同為 2000 lines)
5. 差異記錄ISP 前端差異造成的亮度差記錄並解釋差異來源
SOP 紀律:跨平台最常見的坑是「數值照搬」——exposure 的單位、gains 的定義、位址(0x3c vs 0x36)都要先對照。一律以「感測器 register 的最終值」為驗證標準,而不是平台 API 的數字。

15.16 平台間對照:調校能力總覽

面向Orange PiRPi5Orin NanoThor
抽象層最低(V4L2 subdev)中(libcamera)高(Argus)最高(Holoscan)
開放度最高(全開放)開源封閉封閉
調校深度低–中
工具鏈V4L2 + 自寫 Pythonlibcamera toolsNVIDIA toolsHoloscan SDK
學習曲線陡(要懂底層)中(封閉但強)中(新)
適合理解感測器開源產品量產畫質多機/雲端
核心領悟:四平台做的是同一件事,介面不同但原理 100% 可平移。Orange Pi 是「最低抽象層」——把它學透,等於拿到其他平台介面底下的共同底層。

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

checklist
- [ ] 我能完成跨平台移植對照專案並產出文件。
- [ ] 我能換算 Orange Pi 的 lines 與 RPi5 的 µs 曝光單位。
- [ ] 我能換算整數 gains(128=1.0×)與浮點比值。
- [ ] 我知道 Orin/Thor 的 OV 位址是 0x36 而非 0x3c。
- [ ] 我理解「感測器物理可攜、介面不可攜」並能舉例。
- [ ] 我能用「感測器 register 最終值」驗證跨平台等效性。

15.18 Register 位元級完整工作流

跨平台移植的核心是「register 概念的對應」。以下是四平台的位元級比較:

面向Orange Pi (V4L2)RPi5 (libcamera)Orin Nano (NVIDIA)Thor (Holoscan)
曝光控制0x3500~0x3502 (lines)ExposureTime (µs)NVIDIA AE (µs)NVIDIA AE (µs)
增益控制0x350A (整數 128=1.0×)AnalogueGain (浮點)NVIDIA gainNVIDIA gain
AWB 控制0x5185/0x5187 (整數)ColourGains (浮點)NVIDIA AWBNVIDIA AWB
I2C 位址0x3c0x3c0x360x36
format 控制media-ctl -Vlibcamera formatNVIDIA formatHoloscan format
位元級關鍵: 跨平台移植的「翻譯公式」:
• 曝光:lines × row週期(29.6µs) = µs
• 增益:整數 / 128 = 浮點比值
• I2C:先 i2cdetect 確認位址
• format:SRGGB10/1X10 是四平台的共同語言

15.19 多層疑難排解決策樹

決策樹 A:跨平台移植失敗

決策樹 A
從 Orange Pi 移植到 RPi5 失敗?
├─ I2C 位址不同(0x3c vs 0x36)
│  └─ 先 i2cdetect 確認位址
├─ 曝光單位不同(lines vs µs)
│  └─ 換算:lines × 29.6µs = µs
├─ 增益單位不同(整數 vs 浮點)
│  └─ 換算:整數 / 128 = 浮點
├─ format 描述不同
│  └─ 用「位元深 + Bayer order」統一描述
└─ 控制 API 不同
   └─ V4L2_CID_* vs libcamera controls

決策樹 B:跨平台影像品質不一致

決策樹 B
四平台影像品質不一致?
├─ 曝光設定不同 → 統一 exposure 值
├─ AWB 設定不同 → 統一 gains 值
├─ ISP 管線不同 → 確認各平台 ISP 差異
├─ format 不同 → 統一 Bayer order + 位元深
└─ 後處理不同 → 確認各平台工具差異
   └─ 用「感測器 register 最終值」驗證等效性

15.20 量測驗證完整 SOP

步驟指令預期輸出判讀標準
1. Orange Pi 基準i2cget -y 3 0x3c 0x3500exposure 值基準值
2. 換算 µslines × 29.6µsµs 值RPi5/NVIDIA 用
3. RPi5 設定libcamera --set-ctrl=ExposureTime=XXXµs 設定等效曝光
4. 增益換算整數 / 128 = 浮點浮點值RPi5 用
5. 取幀對比四平台各取一幀四張影像品質一致
6. 量測 Delta EPython scriptDelta E< 3(一致)

15.21 四平台終極對照

面向Orange PiRPi5Orin NanoThor推薦
代表 SoCRK3588 / H618BCM2712Orin NanoT5000依需求
調校框架V4L2 + PythonlibcameraNVIDIA 工具Holoscan底層→V4L2
工具鏈V4L2 + 自寫libcamera toolsNVIDIA toolsHoloscan SDK學習→V4L2
學習曲線陡(底層)中(封閉但強)中(新)底層→Orange Pi
適合理解感測器開源產品量產畫質多機/雲端依目標選

15.22 完整 Bring-up 專案 Checklist

checklist
- [ ] 完成「跨平台移植對照」專案並產出文件
- [ ] 換算 Orange Pi 的 lines 與 RPi5 的 µs 曝光單位
- [ ] 換算整數 gains(128=1.0×)與浮點比值
- [ ] 確認 Orin/Thor 的 OV 位址是 0x36 而非 0x3c
- [ ] 驗證「感測器物理可攜、介面不可攜」並舉例
- [ ] 用「感測器 register 最終值」驗證跨平台等效性
- [ ] 產出「cross-platform translation table」
- [ ] 用「位元深 + Bayer order」統一描述格式
- [ ] 產出「platform comparison report」(含數據)
- [ ] 用「底層→開源→封閉」三分法選平台
看完這單元你應該能說出:
  • 四平台調校能力差異。
  • Orange Pi 定位:底層開放、功能有限。
  • 各平台工具鏈與門檻。
  • 依目的選平台。

延伸閱讀