Camera ITS

相机图像测试套件 (ITS) 是一个用于对 Android 相机生成的图像运行测试的框架。ITS 中每个测试的总体目标是以特定方式配置相机,拍摄一张或多张照片,并检查这些照片,看它们是否包含预期的图像数据。许多测试都要求相机对准特定的目标图表或在特定的强度下进行照明。

ITS 位于 CTS 验证程序测试工具中,路径为 cts/apps/CameraITS。设备必须通过与相机框架为第三方应用宣传的受支持功能相对应的 ITS 测试,作为 CTS 的子集。

设置

要运行 ITS 测试,必须进行以下设置:

  • 被测设备 (DUT)
  • 主机(例如,Linux 桌面设备或笔记本电脑)
  • 相机拍摄的场景

被测设备 (DUT) 设置

要设置 DUT,请按照以下步骤操作:

  1. 通过 USB 将 DUT 连接到主机。
  2. 授予主机通过 ADB 访问 DUT 的权限。
  3. 将 CTS 验证程序应用 (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 和软件包版本,请参阅相应版本的 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 位于三脚架上
  • 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 验证程序应用。在测试菜单中,选择 Camera ITS Test(相机 ITS 测试)。

  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(相机 ITS 测试)条目随后会变为绿色,表示手机已通过 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 测试通过验证相机数据中提供的拍摄曝光和增益的噪声值是否正确来验证噪声模型。