相机 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 和软件包版本,请参阅相应版本的相机 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 测试。

如果您在运行时看到错误消息“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 测试脚本会显示提示,要求用户更改场景设置。

手机屏幕方向必须设置为摄像头拍摄图像时不旋转。若要检查这一点,最简单的方法是使用 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

sensors_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 文件

以下是包含多个测试平台、一个平板电脑测试平台和一个 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 验证程序应用。在测试菜单中,选择相机 ITS 测试

  2. 在主机中,从 CameraITS/ 目录运行 ITS 测试。例如,如果是配有前置摄像头和后置摄像头的设备,请运行以下命令:

    python tools/run_all_tests.py
    

    该脚本会根据 config.yml 文件迭代摄像头和测试场景。对于调试设置,我们建议您通过单个测试运行其中一个 scene2 场景,以最快的速度完成调试。

    对于手动测试,在开始对每个场景运行一组 ITS 测试之前,脚本会拍摄当前场景的照片,将其保存为 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 测试是 PASS、FAIL 还是 SKIP,其中 SKIP 表示测试已通过,因为设备未通告正在测试的底层功能。例如,如果设备没有通过相机接口通告其支持 DNG,系统就会跳过与 DNG 文件捕获相关的测试,并计为通过。

  3. 如需确认测试已达到测试要求,请点按绿色对勾标记按钮。然后,CTS 验证程序测试菜单中的相机 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 的功能,则必须在每张照片的拍摄结果元数据中提供噪声模型。此噪声模型必须嵌入到声称支持 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 测试通过验证摄像头数据中提供的镜头曝光和增益的噪声值是否正确来验证噪声模型。