相機 ITS

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

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

設定

如要執行 ITS 測試,必須先設定下列項目:

  • 測試裝置 (DUT)
  • 主機 (例如 Linux 桌上型電腦或筆記型電腦)
  • 相機拍照的場景

受測試裝置 (DUT) 設定

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

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

    extract root/out/host/linux-x86/cts-verfier/android-cts-verifier.zip
    cd android-cts-verifier
    adb install -r -g CtsVerifier.apk

主機設定

進行 ITS 測試時,主機必須透過 USB 連線至 DUT,並能使用 ADB 進行裝置控制和通訊,以及安裝必要軟體。

如要設定主機,請務必安裝下列軟體。

Android SDK 平台工具

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

Python

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

Mobly

針對 Android 12 以上版本,您必須安裝 Mobly 測試架構。您可以使用 Mobly 在 its_base_test 類別中設定 DUT 和圖表平板電腦。如要安裝 Mobly 測試架構,請執行:

pip install mobly

環境設定

如要設定測試環境,請執行:

cd CameraITS
source build/envsetup.sh

這個指令會檢查 Python 安裝作業、設定 PYTHONPATH 環境變數,並針對 utils/*.py 模組執行單元測試。如果終端機沒有顯示任何錯誤,表示環境已準備好執行 ITS 測試。

情境設定

如要設定情境,建議您使用 Camera ITS-in-a-box 設定,以便輕鬆進行自動化、可靠且有效率的測試。ITS-in-a-box 測試架支援 ITS 的所有照明、居中和圖表變更需求。此外,ITS-in-a-box 是相機擴充功能測試的必要條件。

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

  • 被測試裝置位於三腳架上
  • 每項測試的 DUT 都會指向正確的場景。(ITS 測試指令碼會在開始測試前,提示變更場景設定)。
  • 被測試裝置已透過 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=1 scenes=2,1,0

sensor_fusion 場景設定檔.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

多個測試平台的 config.yml 檔案

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

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

執行 ITS 測試

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

叫用測試

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

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

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

    python tools/run_all_tests.py

    這個指令碼會根據 config.yml 檔案,依序測試攝影機和場景。針對偵錯設定,建議您執行 scene2 場景,並進行單一測試,以便快速完成。

    在手動測試時,指令碼會先拍攝目前場景的相片,並將相片儲存為 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 Verifier 測試選單中的「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 測試會驗證鏡頭曝光的雜訊值和相機資料中提供的雜訊值,來驗證雜訊模型。