相機 ITS 總覽

相機影像測試套件 (ITS) 是一種架構,可對 Android 相機產生的影像執行測試。ITS 中每項測試的一般目標,都是以特定方式設定攝影機、拍攝一或多張相片,然後檢查相片是否含有預期的圖像資料。許多測試都要求攝影機對準特定目標圖表,或以特定強度照明。

ITS 位於 CTS 驗證器測試架構的 cts/apps/CameraITS 中。裝置必須通過 ITS 測試,才能支援相機架構為第三方應用程式宣傳的功能,這些功能是 CTS 的子集。

設定

如要執行 ITS 測試,必須完成下列設定:

  • 測試裝置 (DUT)
  • 主機 (例如 Linux 桌機或筆電)
  • 攝影機拍攝的場景

設定受測裝置 (DUT)

如要設定 DUT,請按照下列步驟操作:

  1. 透過 USB 將 DUT 連接至主機。
  2. 授予主機權限,透過 ADB 存取 DUT。
  3. 在裝置上安裝 CTS Verifier 應用程式 (CtsVerifier.apk)。詳情請參閱「使用 CTS 驗證器」。

    extract root/out/host/linux-x86/cts-verfier/android-cts-verifier.zip
    cd android-cts-verifier
    adb install -r -g CtsVerifier.apk
  4. 在 DUT 上啟動預設的相機應用程式,並清除啟動時顯示的所有視窗,以免測試期間發生干擾。

主機設定

ITS 需要主機透過 USB 連接至 DUT,能夠使用 ADB 控制及與裝置通訊,並安裝必要軟體。

如要設定主機,請確認已安裝下列軟體。

Android SDK 平台工具

您必須安裝 Android SDK Platform-tools,且 ADB 必須位於主機上執行的殼層或終端機可執行路徑中。如需 Android SDK Platform Tools 的公開發布版本,請參閱「SDK Platform Tools 版本資訊」。

Python

主機必須安裝 Python。建議使用隨附的 Python 發行版本,確保支援相容版本。如要瞭解特定版本應安裝的 Python 和套件版本,請參閱對應版本的 Camera ITS 版本資訊。

Mobly

如果是 Android 12 以上版本,則必須安裝 Mobly 測試架構。您可以在 its_base_test 類別中設定 DUT 和圖表平板電腦。如要安裝 Mobly 測試架構,請執行下列指令:

pip install mobly

環境設定

如要設定測試環境,請執行下列指令:

cd CameraITS
source build/envsetup.sh

這項指令會檢查 Python 安裝作業、設定 PYTHONPATH 環境變數,並對 utils/*.py 模組執行單元測試。如果終端機未列印任何錯誤,表示環境已準備就緒,可以執行 ITS 測試。

場景設定

如要設定場景,建議使用攝影機 ITS-in-a-box 設定,方便自動化、提高測試可靠性及效率。ITS-in-a-box 測試裝置支援 ITS 的所有照明、置中和圖表變更需求。此外,測試相機擴充功能時,也需要 ITS-in-a-box。

如要手動測試,請確認下列事項:

  • DUT 位於三腳架上
  • DUT 會指向每個測試的正確場景。(ITS 測試指令碼會在新的場景中開始測試前,提供提示來變更場景設定)。
  • DUT 透過 USB 連接至主機。
  • 測試執行期間,DUT 不會移動。
  • 場景由穩定不閃爍的光源照明。(請勿使用螢光燈,因為螢光燈會造成閃爍。)

ITS 測試指令碼會顯示提示,要求使用者先變更場景設定,再開始測試新場景。

手機方向必須經過設定,相機才能拍攝未經旋轉的圖片。如要檢查這點,最簡單的方法是使用 scene2 中的臉部場景。大多數手機會以橫向模式顯示,並逆時針旋轉後置鏡頭,順時針旋轉前置鏡頭。

設定檔

使用 Mobly 架構時,您必須建立 config.yml 設定檔,定義 Mobly 測試平台。以下是不同用途的範例。

平板電腦型場景的 config.yml 檔案

以下是平板電腦場景的 config.yml 檔案範例。如要進行平板電腦測試,測試平台名稱必須包含 TABLET 關鍵字。初始化期間,Mobly 測試執行器會初始化檔案中的參數,並將這些參數傳遞至個別測試。

TestBeds:
  - Name: TEST_BED_TABLET_SCENES
    # Test configuration for scenes[0:4, 6, _change]
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut
          - serial: 5B16001229
            label: tablet

    TestParams:
      brightness: 192
      chart_distance: 22.0
      debug_mode: "False"  # "True" or "False"; quotes needed
      lighting_cntl: <controller-type>  # "arduino" or "None"; quotes needed
      lighting_ch: <controller-channel>
      camera: 0
      foldable_device: "False". # set "True" if testing foldable
      scene: <scene-name>  # if <scene-name> runs all scenes

如要叫用測試平台,請執行 tools/run_all_tests.py。如果沒有指定攝影機或場景的命令列值,系統會使用 config.yml 檔案值執行測試。如果攝影機或場景有指令列值,這些值會覆寫 config.yml 檔案 TestParams 區段中的值。例如:

python tools/run_all_tests.py
python tools/run_all_tests.py camera=1
python tools/run_all_tests.py scenes=2,1,0
python tools/run_all_tests.py camera=0 scenes=scene_tele
python tools/run_all_tests.py camera=0.4 scenes=4,scene6_tele

sensor_fusion 場景 config.yml 檔案

以下是 sensor_fusion 測試的 config_yml 檔案範例。如要進行 sensor_fusion 測試,關鍵字 SENSOR_FUSION 必須位於測試平台名稱中。由於預覽和影片穩定性測試的緣故,Android 13 以上版本僅支援 Arduino 控制器進行感應器融合。Android 12 支援 Arduino 和 Canakit 控制器。

Testbeds
  - Name: TEST_BED_SENSOR_FUSION
    # Test configuration for sensor_fusion/test_sensor_fusion.py
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut

    TestParams:
      fps: 30
      img_size: 640,480
      test_length: 7
      debug_mode: "False"
      chart_distance: 25
      rotator_cntl: arduino
      rotator_ch: 1
      camera: 0

如要使用感應器融合盒執行 sensor_fusion 測試,請執行下列指令:

python tools/run_all_tests.py scenes=sensor_fusion
python tools/run_all_tests.py scenes=sensor_fusion camera=0
python tools/run_all_tests.py scenes=scene_flash,feature_combination
python tools/run_all_tests.py scenes=checkerboard camera=1

多個測試平台 config.yml 檔案

以下是 config.yml 檔案範例,其中包含多個測試平台,包括平板電腦測試平台和 sensor_fusion 測試平台。正確的測試平台取決於測試的場景。

Testbeds
  - Name: TEST_BED_TABLET_SCENES
    # Test configuration for scenes[0:4, 6, _change]
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut
          - serial: 5B16001229
            label: tablet

    TestParams:
      brightness: 192
      chart_distance: 22.0
      debug_mode: "False"
      chart_loc_arg: ""
      camera: 0
      scene: <scene-name>           # if <scene-name> runs all scenes

  - Name: TEST_BED_SENSOR_FUSION
    # Test configuration for sensor_fusion/test_sensor_fusion.py
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut

    TestParams:
      fps: 30
      img_size: 640,480
      test_length: 7
      debug_mode: "False"
      chart_distance: 25
      rotator_cntl: arduino         # cntl can be arduino or canakit
      rotator_ch: 1
      camera: 0

手動測試 config.yml 檔案

以下是手動測試的 config.yml 檔案範例。從 Android 14 開始,除了 scene_extensions 測試外,所有測試都支援手動測試。如要進行手動測試,測試平台名稱中必須包含 MANUAL 關鍵字。 此外,AndroidDevice 區段不得包含平板電腦的序號或標籤區段。

TestBeds:
  - Name: TEST_BED_MANUAL
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut

    TestParams:
      debug_mode: "False"
      camera: 0
      scene: 1

第 2 代測試設備設定 config.yml 檔案

以下是 TEST_BED_GEN2 測試平台的 config.yml 檔案範例。 這個測試平台用於 scene_ip 測試,採用第 2 代測試裝置](/docs/compatibility/cts/camera-its-box-gen2)。以下範例顯示 Gen2 測試平台可用,且未略過 scene_ip 測試時的測試平台參數。

Testbeds
  - Name: TEST_BED_GEN2
    # Test configuration for scene_ip/test_default_jca_ip.py
    Controllers:
        AndroidDevice:
          - serial: <device-id>  # quotes needed if serial id entirely numeric
            label: dut
    TestParams:
      debug_mode: "False"  # quotes are needed here
      chart_distance: 30
      rotator_cntl: gen2_rotator   # gen2 rig specific. "None" if gen2 rig not available
      rotator_ch: 0
      camera: <camera-id>
      foldable_device: "False"  # "True" if testing foldable device
      tablet_device: "False"  # "True" if testing tablet device
      lighting_cntl: gen2_lights  # gen2 rig specific. "None" if gen2 rig not available
      lighting_ch: 1
      scene: scene_ip

以下範例顯示 Gen2 測試平台無法使用,且 scene_ip 測試已略過時的測試平台參數。

Testbeds
  - Name: TEST_BED_GEN2
    # Test configuration for scene_ip/test_default_jca_ip.py
    Controllers:
        AndroidDevice:
          - serial: <device-id>  # quotes needed if serial id entirely numeric
            label: dut
    TestParams:
      debug_mode: "False"  # quotes are needed here
      chart_distance: 30
      rotator_cntl: "None"   # gen2 rig specific. "None" if gen2 rig not available
      rotator_ch: <controller-channel>
      camera: <camera-id>
      foldable_device: "False"  # "True" if testing foldable device
      tablet_device: "False"  # "True" if testing tablet device
      lighting_cntl: "None"  # gen2 rig specific. "None" if gen2 rig not available
      lighting_ch: <controller-channel>
      scene: scene_ip

如要執行 scene_ip 測試,請使用下列任一指令:

python tests/scene_ip/test_default_jca_ip.py -c config.yml
python tools/run_all_tests.py camera=<camera-id> scenes=scene_ip

執行 ITS 測試

本節說明如何執行 ITS 測試。

叫用測試

設定裝置、主機 (包括環境) 和實體場景後,請按照下列程序執行 ITS 測試。

  1. 開啟 CTS Verifier 應用程式,然後在測試選單中選取「Camera ITS Test」

  2. 在主機上,從 CameraITS/ 目錄執行 ITS 測試。舉例來說,如果裝置有前置和後置鏡頭,請執行下列指令:

    python tools/run_all_tests.py

    腳本會根據 config.yml 檔案,逐一檢查攝影機和測試場景。如要偵錯設定,建議您執行一個 scene2 場景,並進行單一測試,以加快周轉時間。

    如要進行手動測試,請先在每個場景中執行一組 ITS 測試,然後指令碼會拍攝目前場景的相片、儲存為 JPEG、將 JPEG 的路徑列印到控制台,並要求使用者確認圖片是否正常。這個「擷取並確認」流程會重複執行,直到使用者確認圖片正常為止。以下是這個流程中的訊息。

    Preparing to run ITS on camera 0
    Start running ITS on camera:  0
    Press Enter after placing camera 0 to frame the test scene:
    scene1_1
    The scene setup should be: A grey card covering at least the   middle 30% of the scene
    Running vendor 3A on device
    Capture an image to check the test scene
    Capturing 1 frame with 1 format [yuv]
    Please check scene setup in /tmp/tmpwBOA7g/0/scene1_1.jpg
    Is the image okay for ITS scene1_1? (Y/N)
    

    每次執行指令碼時,系統都會列印記錄,顯示每個 ITS 測試的 PASSFAILFAIL*SKIPFAIL* 表示測試失敗,但由於測試尚未強制執行,因此測試會向 CtsVerifier 回報為 PASSSKIP 表示測試通過,因為裝置未宣傳受測的基礎功能。舉例來說,如果裝置未透過攝影機介面宣傳支援 DNG,系統就會略過與 DNG 檔案擷取相關的測試,並將其計為 PASS

  3. 如要確認測試符合測試規定,請輕觸綠色勾號按鈕。CTS 驗證器測試選單中的「Camera ITS Test」項目會變成綠色,表示手機已通過 Camera ITS。

平行 DUT 測試

搭載 Android 14 以上版本的裝置支援平行 DUT 測試。這樣一來,您就能使用多個裝置同時測試 DUT,加快整體測試速度。舉例來說,平行測試可讓您同時在一個裝置中測試攝影機 0,在另一個裝置中測試攝影機 1。所有平行測試工作階段的測試都會匯總到參考 DUT 的 CTS 驗證器工作階段。您必須使用 Arduino 照明控制執行並行測試,因為並行測試不支援手動照明控制。請務必確保同一 Arduino 控制器上的不同通道,可控制每個裝置的照明。

以下是 config.yml 檔案範例,定義要平行執行的三個測試平台。

TestBeds:
  - Name: TEST_BED_TABLET_SCENES_INDEX_0
    Controllers:
        AndroidDevice:
          - serial: <device-id-0>
            label: dut
          - serial: <tablet-id-0>
            label: tablet
    TestParams:
      brightness: 192
      chart_distance: 22.0
      debug_mode: "False"
      lighting_cntl: "arduino"
      lighting_ch: <controller-channel-0>
      camera: 0
      scene: <scene-name>  # if <scene-name> left as-is runs all scenes
      foldable_device: "False"

  - Name: TEST_BED_TABLET_SCENES_INDEX_1
    Controllers:
        AndroidDevice:
          - serial: <device-id-1>
            label: dut
          - serial: <tablet-id-1>
            label: tablet
    TestParams:
      brightness: 192
      chart_distance: 22.0
      debug_mode: "False"
      lighting_cntl: "arduino"
      lighting_ch: <controller-channel-1>
      camera: 1
      scene: <scene-name>  # if <scene-name> left as-is runs all scenes
      foldable_device: "False"

  # TEST_BED_SENSOR_FUSION represents testbed index 2
  # Parallel sensor_fusion is currently unsupported due to Arduino requirements
  - Name: TEST_BED_SENSOR_FUSION
    # Test configuration for sensor_fusion
    Controllers:
        AndroidDevice:
          - serial: <device-id>
            label: dut
    TestParams:
      fps: 30
      img_size: 640,480
      test_length: 7
      debug_mode: "False"
      chart_distance: 25
      rotator_cntl: "arduino"
      rotator_ch: <controller-channel-2>
      camera: <camera-id>
      foldable_device: "False"
      tablet_device: "False"
      lighting_cntl: "None"
      lighting_ch: <controller-channel>
      scene: "sensor_fusion"

如要平行執行測試平台,請使用下列指令:

for i in 0 1 2; do python3 tools/run_all_tests.py testbed_index=$i num_testbeds=3 & done; wait

DNG 雜訊模型

如果裝置宣稱可擷取 RAW 或 DNG 格式的相片,則必須在每張原始相片的擷取結果中繼資料中提供雜訊模型。對於聲稱支援的裝置,這項雜訊模型必須嵌入每個攝影機 (例如前置和後置攝影機) 的攝影機 HAL 中。

導入雜訊模型

如要實作雜訊模型,請按照下列步驟生成雜訊模型,並將模型嵌入攝影機 HAL。

  1. 如要為每部攝影機生成雜訊模型,請在 tools 目錄中執行 dng_noise_model.py 指令碼。這會輸出 C 程式碼片段。如要進一步瞭解如何設定攝影機及擷取環境,請參閱 tools 目錄中的 DngNoiseModel.pdf 文件。

  2. 如要為裝置實作雜訊模型,請將 C 程式碼片段剪下並貼到攝影機 HAL 中。

噪音模型驗證

tests/scene1_1/test_dng_noise_model.py 自動 ITS 測試會驗證雜訊模型,確認相機資料中提供的拍攝曝光和增益雜訊值是否正確。