相機ITS

相機影像測試套件 (ITS) 是用於對 Android 相機產生的影像運行測試的框架。 ITS 中每次測試的總體目標是以特定方式配置相機、捕捉一張或多張照片,並檢查這些照片是否包含預期的影像資料。許多測試需要將相機指向特定的目標圖表或以特定的強度照明。

ITS 位於cts/apps/CameraITS中的 CTS Verifier 測試工具中。設備必須透過與相機框架為第三方應用程式作為 CTS 子集宣傳的支援功能相對應的 ITS 測試。

設定

要執行 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
    

主機設定

ITS要求主機透過USB連接到DUT,能夠使用ADB進行設備控制和通信,並安裝所需的軟體。

若要設定主機,請確保安裝了以下軟體。

Android SDK平台工具

必須安裝 Android SDK 平台工具,且 ADB 必須位於主機上執行的 shell 或終端機的可執行路徑中。有關 Android SDK 平台工具的公開發布版本,請參閱SDK 平台工具發行說明

Python

Python 必須安裝在主機上。我們建議使用捆綁的 Python 發行版以確保對相容版本的支援。有關特定版本要安裝哪些 Python 和軟體包版本的詳細信息,請參閱相應版本的相機 ITS 發行說明。

莫布利

對於 Android 12 及更高版本,必須安裝 Mobly 測試框架。 Mobly 可讓您在its_base_test類別中設定DUT 和圖表平板電腦。若要安裝 Mobly 測試框架,請執行:

pip install mobly

環境設定

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

cd CameraITS
source build/envsetup.sh

此指令檢查 Python 安裝,設定PYTHONPATH環境變量,並對utils/*.py模組執行單元測試。如果終端沒有列印任何錯誤,則環境已準備好執行 ITS 測試。

如果執行階段看到錯誤libtinfo.so.6: no version information available (required by /bin/sh) ,請執行下列指令重命名libtinfo.so.6檔案。

mv $ENV_DIRECTORY/lib/libtinfo.so.6 $ENV_DIRECTORY/lib/libtinfo.so.6.bak

場景設定

為了設定場景,我們建議使用相機 ITS 盒裝設置,以簡化測試的自動化、可靠性和效率。盒裝 ITS 測試台支援 ITS 的所有照明、居中和圖表變更要求。此外,相機擴充測試還需要盒裝 ITS。

對於手動測試,請確保以下幾點:

  • DUT 位於三腳架上
  • 每次測試時,DUT 都會指向正確的場景。 (ITS 測試腳本提供在新場景中開始測試之前更改場景設定的提示。)
  • DUT 透過 USB 連接到主機。
  • 測試運行期間 DUT 不會移動。
  • 場景由穩定、非波動的光源照亮。 (不要使用螢光燈,因為這會引起閃爍。)

ITS 測試腳本會顯示提示,要求使用者在新場景開始測試前變更場景設定。

必須設定手機方向,以便相機在不旋轉的情況下拍攝影像。檢查這一點的最簡單方法是使用場景 2 中的臉部場景。大多數手機的手機都是橫向的,手機逆時針旋轉後置鏡頭,順時針旋轉前置鏡頭。

設定檔

使用 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場景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

多個測試台 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

運行 ITS 測試

本節介紹如何執行 ITS 測試。

調用測試

設定好設備、主機(包括環境)和實體場景後,請依照下列流程執行 ITS 測試。

  1. 打開 CTS Verifer 應用程式。在測試選單中,選擇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 測試的“通過”、“失敗”或“跳過”,其中“跳過”表示測試已通過,因為設備未通告正在測試的底層功能。例如,如果設備未透過相機介面宣傳其支援 DNG,則將跳過與 DNG 檔案擷取相關的測試併計為通過。

  3. 若要確認測試已符合測試要求,請點選綠色複選標記按鈕。 CTS Verifier 測試選單中的「相機 ITS 測試」條目隨後變為綠色,表示手機已通過相機 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 測試透過驗證相機資料中提供的鏡頭曝光和增益的雜訊值是否正確來驗證雜訊模型。