Android 12 版本中包含许多相机 ITS更改。本页总结了分为四大类的变化:
重构为 Python 3
由于 2020 年 1 月 Python 2.7 被弃用,整个 Camera ITS 代码库被重构为 Python 3。Android 12 需要以下 Python 版本和库:
- Python 3.7.9 或 Python 3.7.10
- OpenCV 3.4.2
- Numpy 1.19.2
- Matplotlib 3.3.2
- Scipy 1.5.2
- pySerial 3.5
- 枕头 8.1.0
- PyYAML 5.3.1
主测试启动器tools/run_all_tests.py
与 Android 11 或更低版本保持一致,并重构为 Python 3。
所有单独的测试都被重构并使用在tests/its_base_test.py
中定义的新测试设置类。大多数测试名称和功能保持不变。在 Android 12 中,所有单独的测试现在都会加载它们的场景。虽然每个测试的场景加载都会增加整体测试时间,但它可以调试单个测试。
有关单个测试更改的详细信息,请参阅测试更改。
以下 Python 模块通过名称更改进行了重构:
-
pymodules/its/caps.py
→utils/camera_properties_utils.py
-
pymodules/its/cv2image.py
→utils/opencv_processing_utils.py
-
pymodules/its/device.py
→utils/its_session_utils.py
-
pymodules/its/error.py
→utils/error_util.py
-
pymodules/its/image.py
→utils/image_processing_utils.py
image_processing_utils.py -
pymodules/its/objects.py
→utils/capture_request_utils.py
-
pymodules/its/target.py
→utils/target_exposure_utils.py
-
tools/hw.py
→utils/sensor_fusion_utils.py
Mobly 测试框架采用
Mobly是一个基于 Python 的测试框架,支持需要具有自定义硬件设置的多个设备的测试用例。 Camera ITS 使用 Mobly 测试基础设施来更好地控制和记录测试。
Camera ITS 使用 Mobly 测试基础设施来更好地控制和记录测试。 Mobly 是一个基于 Python 的测试框架,支持需要具有自定义硬件设置的多个设备的测试用例。有关 Mobly 的更多信息,请参阅google/mobly 。
config.yml 文件
使用 Mobly 框架,您可以在its_base_test
类中设置被测设备 (DUT) 和图表输入板。 config.yml
(YAML) 文件用于创建 Mobly 测试平台。可以在此配置文件中配置多个测试平台,例如平板电脑和传感器融合测试平台。在每个测试台的控制器部分中,您可以指定device_ids
以向测试运行器识别适当的 Android 设备。除了设备 ID 之外,其他参数,例如平板brightness
、 chart_distance
、 debug_mode
模式、 camera_id
和scene_id
都在测试类中传递。常见的测试参数值有:
brightness: 192 (all tablets except Pixel C)
chart_distance: 31.0 (rev1/rev1a box for FoV < 90° cameras)
chart_distance: 22.0 (rev2 test rig for FoV > 90° cameras)
基于平板电脑的测试
对于基于平板电脑的测试,关键字TABLET
必须出现在测试平台名称中。在初始化期间,Mobly 测试运行程序初始化TestParams
并将它们传递给各个测试。
以下是基于平板电脑运行的示例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
可以使用tools/run_all_tests.py
调用测试平台。如果不存在命令行值,则使用config.yml
文件值运行测试。此外,您可以使用类似于 Android 11 或更低版本的命令在命令行中覆盖camera
和scene
配置文件的值。
例如:
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
。正确的测试平台由测试的场景决定。 Android 12 支持 Arduino 和 Canakit控制器进行传感器融合。
以下是传感器融合运行的示例config.yml
文件。
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 # cntl can be arduino or canakit
rotator_ch: 1
camera: 0
要使用传感器融合测试台运行传感器融合测试,请使用:
python tools/run_all_tests.py scenes=sensor_fusion
python tools/run_all_tests.py scenes=sensor_fusion camera=0
多个测试台
配置文件中可以包含多个测试平台。最常见的组合是同时拥有一个平板电脑测试平台和一个传感器融合测试平台。
以下是包含平板电脑和传感器融合测试平台的示例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
手动测试
Android 12 继续支持手动测试。但是,测试平台必须在测试平台名称中使用关键字MANUAL
来标识测试。此外,测试平台不能包含平板电脑 ID。
以下是用于手动测试的示例config.yml
文件。
TestBeds:
- Name: TEST_BED_MANUAL
Controllers:
AndroidDevice:
- serial: 8A9X0NS5Z
label: dut
TestParams:
debug_mode: "False"
chart_distance: 31.0
camera: 0
scene: scene1
没有平板电脑的测试场景
可以使用TEST_BED_TABLET_SCENES
或TEST_BED_MANUAL
对场景 0 和场景 5 进行测试。但是,如果使用TEST_BED_TABLET_SCENES
完成测试,则必须连接数位板并且即使未使用数位板,数位板序列号也必须有效,因为测试类设置为数位板分配了序列号值。
运行单个测试
单个测试只能出于调试目的运行,因为它们的结果不会报告给CTS Verifier 。因为config.yml
文件不能在camera
和scene
的命令行中被覆盖,所以这些参数在config.yml
文件中必须是正确的,以用于相关的单个测试。此外,如果配置文件中有多个测试平台,则必须使用--test_bed
标志指定测试平台。例如:
python tests/scene1_1/test_black_white.py --config config.yml --test_bed TEST_BED_TABLET_SCENES
测试工件
在 Android 12 中,Camera ITS 的测试工件的存储方式与 Android 11 或更低版本类似,但有以下更改:
- 为清楚起见,测试工件
/tmp
目录将CameraITS_
到 8 个字符的随机字符串中。 - 每个测试的测试输出和错误都存储在
test_log.DEBUG
中,而不是test_name_stdout.txt
和test_name_stderr.txt
中。 - 每个单独测试的 DUT 和平板电脑 logcat 都存储在
/tmp/CameraITS_########
目录中,从而简化了调试,因为记录了调试 3A 问题所需的所有信息。
测试更改
在 Android 12 中,平板电脑场景是 PNG 文件而不是 PDF 文件。使用 PNG 文件可以让更多的平板电脑模型正确显示场景。
场景0/test_jitter.py
test_jitter
测试在 Android 12 中的物理隐藏摄像头上运行。
场景1_1/test_black_white.py
对于 Android 12, test_black_white
具有test_black_white
和test_channel_saturation
的功能。
下表描述了 Android 11 中的两个单独测试。
测试名称 | 第一个 API 级别 | 断言 |
---|---|---|
场景1_1/test_black_white.py | 全部 | 短曝光,低增益 RGB 值 ~[0, 0, 0] 长时间曝光,高增益 RGB 值 ~[255, 255, 255] |
场景1_1/test_channel_saturation.py | 29 | 降低 [255, 255, 255] 差异的容差,以消除白色图像中的色彩色调。 |
下表描述了 Android 12 中的合并测试 scene1_1/test_black_white.py。
测试名称 | 第一个 API 级别 | 断言 |
---|---|---|
场景1_1/test_black_white.py | 全部 | 短曝光,低增益 RGB 值 ~[0, 0, 0] 长时间曝光,高增益 RGB 值 ~[255, 255, 255] 并降低值之间的容差以消除白色图像中的色彩色调。 |
场景1_1/test_burst_sameness_manual.py
test_burst_sameness_manual
测试在 Android 12 中的物理隐藏摄像头上运行。
场景1_2/test_tonemap_sequence.py
test_tonemap_sequence
测试在 Android 12 的有限摄像头上运行。
场景1_2/test_yuv_plus_raw.py
test_yuv_plus_raw
测试在 Android 12 中的物理隐藏摄像头上运行。
场景2_a/test_format_combos.py
test_format_combos
测试在 Android 12 的有限摄像头上运行。
场景3/test_flip_mirror.py
test_flip_mirror
测试在 Android 12 的有限摄像头上运行。
场景4/test_aspect_ratio_and_crop.py
在scene4/test_aspect_ratio_and_crop.py
中寻找圆圈在 Android 12 中进行了重构。
早期的 Android 版本使用的方法涉及在父轮廓(正方形)内查找子轮廓(圆形),并使用大小和颜色过滤器。 Android 12 使用的方法涉及查找所有轮廓,然后通过查找最圆的特征进行过滤。要筛选出显示器上的虚假圆圈,需要一个最小的轮廓区域,并且圆圈的轮廓必须是黑色的。
轮廓及其选择标准如下图所示。
图 1.轮廓和选择标准的概念图
Android 12 方法更简单,可以解决某些平板电脑中的边界框剪裁问题。出于调试目的,所有候选圈子都会被记录下来。
在 Android 12 中,裁剪测试针对FULL
和LEVEL3
设备运行。 Android 11 或更低版本跳过FULL
设备的裁剪测试断言。
下表列出了对应于给定设备级别和第一个 API 级别的test_aspect_ratio_and_crop.py
的断言。
设备级别 | 第一个 API 级别 | 断言 |
---|---|---|
有限的 | 全部 | 纵横比 4:3、16:9、2:1 格式的 FoV |
满的 | < 31 | 纵横比 4:3、16:9、2:1 格式的 FoV |
满的 | ≥ 31 | 庄稼 纵横比 4:3、16:9、2:1 格式的 FoV |
3级 | 全部 | 庄稼 纵横比 4:3、16:9、2:1 格式的 FoV |
场景4/test_multi_camera_alignment.py
对scene4/test_multi_camera_alignment.py
中 YUV 捕获的方法undo_zoom()
进行了重构,以更准确地考虑在与捕获的纵横比不匹配的传感器上进行裁剪。
Android 11 Python 2 代码
zoom_ratio = min(1.0 * yuv_w / cr_w, 1.0 * yuv_h / cr_h)
circle[i]['x'] = cr['left'] + circle[i]['x'] / zoom_ratio
circle[i]['y'] = cr['top'] + circle[i]['y'] / zoom_ratio
circle[i]['r'] = circle[i]['r'] / zoom_ratio
Android 12 Python 3 代码
yuv_aspect = yuv_w / yuv_h
relative_aspect = yuv_aspect / (cr_w/cr_h)
if relative_aspect > 1:
zoom_ratio = yuv_w / cr_w
yuv_x = 0
yuv_y = (cr_h - cr_w / yuv_aspect) / 2
else:
zoom_ratio = yuv_h / cr_h
yuv_x = (cr_w - cr_h * yuv_aspect) / 2
yuv_y = 0
circle['x'] = cr['left'] + yuv_x + circle['x'] / zoom_ratio
circle['y'] = cr['top'] + yuv_y + circle['y'] / zoom_ratio
circle['r'] = circle['r'] / zoom_ratio
sensor_fusion/test_sensor_fusion.py
在 Android 12 中,为传感器融合测试添加了一种检测图像中特征的方法。
在低于 Android 12 的版本中,整个图像用于寻找最佳的 240 个特征,然后将这些特征掩蔽到中心 20% 以避免滚动快门效应,最低特征要求为 30 个特征。
如果该方法发现的特征不足,Android 12会先将特征检测区域掩蔽到中心20%,并将最大特征限制为最小特征要求的2倍。
下图显示了 Android 11 和 Android 12 功能检测之间的区别。提高最小特征要求阈值会导致检测到质量较差的特征并对测量产生负面影响。
图 2. Android 11 和 Android 12 的特征检测差异
新测试
场景0/test_solid_color_test_pattern.py
为 Android 12 启用了一项新测试test_solid_color_test_pattern
。此测试适用于所有相机,如下表所述。
场景 | 测试名称 | 第一个 API 级别 | 描述 |
---|---|---|---|
0 | test_solid_color_test_pattern | 31 | 确认纯色图像输出和图像颜色可编程性。 |
必须启用纯色测试图案才能支持相机隐私模式。 test_solid_color_test_pattern
测试以所选图案定义的颜色确认纯色 YUV 图像输出,并且图像颜色根据规范变化。
参数
cameraPrivacyModeSupport
:确定相机是否支持隐私模式。-
android.sensor.testPatternMode
:设置测试模式模式。此测试使用SOLID_COLOR
。 -
android.sensor.testPatternData
:设置测试模式模式的 R、Gr、Gb、G 测试模式值。
有关纯色测试图案的说明,请参阅SENSOR_TEST_PATTERN_MODE_SOLID_COLOR
。
方法
为参数集捕获 YUV 帧并验证图像内容。测试图案直接从图像传感器输出,因此不需要特定的场景。如果支持PER_FRAME_CONTROL
,则为每个测试设置捕获一个 YUV 帧。如果不支持PER_FRAME_CONTROL
,则捕获四帧,仅分析最后一帧,以最大限度地提高LIMITED
摄像机的测试覆盖率。
YUV 捕获设置为完全饱和的BLACK
、 WHITE
、 RED
、 GREEN
和BLUE
测试模式。由于测试图案定义是根据传感器拜耳图案定义的,因此必须为每种颜色设置颜色通道,如下表所示。
颜色 | 测试模式数据 (RGGB) |
---|---|
黑色的 | (0, 0, 0, 0) |
白色的 | (1, 1, 1, 1) |
红色的 | (1, 0, 0, 0) |
绿色 | (0, 1, 1, 0) |
蓝色的 | (0, 0, 0, 1) |
断言表
下表描述了test_solid_color_test_pattern.py
的测试断言。
相机 第一个 API 级别 | 相机类型 | 断言的颜色 |
---|---|---|
31 | 拜耳 | 黑、白、红、绿、蓝 |
31 | 单核细胞增多症 | 黑,白 |
< 31 | 拜耳/MONO | 黑色的 |
性能等级测试
scene2_c/test_camera_launch_perf_class.py
验证具有 scene2_c 人脸场景的前后主摄像头的摄像头启动时间均小于 500 毫秒。
scene2_c/test_jpeg_capture_perf_class.py
验证具有 scene2_c 面部场景的前后主摄像头的 1080p JPEG 捕获延迟小于 1 秒。