Android 12 版本中包含許多相機 ITS變更。本頁總結了這些變化,分為四大類:
重構為 Python 3
由於 2020 年 1 月棄用了 Python 2.7,整個相機 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
- py串口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
-
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 的測試框架,支援需要具有自訂硬體設定的多個裝置的測試案例。相機 ITS 使用 Mobly 測試基礎架構來更好地控制和記錄測試。
相機 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
沒有平板電腦的測試場景
場景 0 和場景 5 的測試可以使用TEST_BED_TABLET_SCENES
或TEST_BED_MANUAL
完成。但是,如果使用TEST_BED_TABLET_SCENES
進行測試,則必須連接平板電腦,並且即使未使用平板電腦,平板電腦序列 ID 也必須有效,因為測試類別設定會為平板電腦分配序列 ID 值。
運行單獨的測試
單獨的測試只能出於調試目的而運行,因為它們的結果不會報告給CTS Verifier 。由於無法在camera
和scene
的命令列中覆寫config.yml
文件,因此相關的單獨測試,這些參數在config.yml
檔案中必須正確。此外,如果設定檔中有多個測試床,則必須使用--test_bed
標誌指定測試床。例如:
python tests/scene1_1/test_black_white.py --config config.yml --test_bed TEST_BED_TABLET_SCENES
測試工件
在 Android 12 中,相機 ITS 的測試工件的儲存方式與 Android 11 或更低版本類似,但有以下變更:
- 為清楚起見,測試工件
/tmp
目錄已將CameraITS_
新增至 8 個字元的隨機字串前面。 - 每個測試的測試輸出和錯誤都儲存在
test_log.DEBUG
中,而不是test_name_stdout.txt
和test_name_stderr.txt
中。 - 每個單獨測試的 DUT 和平板電腦日誌都儲存在
/tmp/CameraITS_########
目錄中,簡化了偵錯,因為除錯 3A 問題所需的所有資訊都已記錄。
測試變更
在 Android 12 中,平板電腦場景是 PNG 檔案而不是 PDF 檔案。使用PNG檔案可以讓更多的平板電腦型號正確顯示場景。
scene0/test_jitter.py
test_jitter
測試在 Android 12 中的實體隱藏攝影機上運行。
scene1_1/test_black_white.py
對於 Android 12, test_black_white
具有test_black_white
和test_channel_saturation
的功能。
下表描述了 Android 11 中的兩項單獨測試。
測試名稱 | 第一 API 級別 | 斷言 |
---|---|---|
scene1_1/test_black_white.py | 全部 | 短曝光,低增益 RGB 值 ~[0, 0, 0] 長時間曝光,高增益 RGB 值 ~[255, 255, 255] |
scene1_1/test_channel_saturation.py | 29 | 降低了 [255, 255, 255] 差異的容差,以消除白色影像中的色調。 |
下表描述了 Android 12 中的合併測試 scene1_1/test_black_white.py。
測試名稱 | 第一 API 級別 | 斷言 |
---|---|---|
scene1_1/test_black_white.py | 全部 | 短曝光、低增益 RGB 值 ~[0, 0, 0] 長時間曝光、高增益 RGB 值 ~[255, 255, 255] 並降低數值之間的容差,以消除白色影像中的色調。 |
scene1_1/test_burst_sameness_manual.py
test_burst_sameness_manual
測試在 Android 12 中的實體隱藏攝影機上運行。
scene1_2/test_tonemap_sequence.py
test_tonemap_sequence
測試在 Android 12 中的有限相機上運行。
scene1_2/test_yuv_plus_raw.py
test_yuv_plus_raw
測試在 Android 12 中的實體隱藏攝影機上執行。
scene2_a/test_format_combos.py
test_format_combos
測試在 Android 12 中的有限相機上運行。
scene3/test_flip_mirror.py
test_flip_mirror
測試在 Android 12 中的有限相機上運行。
scene4/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 |
scene4/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
感測器融合/test_sensor_fusion.py
在Android 12中,為感測器融合測試添加了偵測影像特徵的方法。
在低於 Android 12 的版本中,整個影像用於尋找最佳 240 個特徵,然後將其屏蔽到中心 20%,以避免捲簾快門效果,最低特徵要求為 30 個特徵。
如果此方法找到的特徵不足,Android 12 首先將特徵偵測區域向中心屏蔽 20%,並將最大特徵限制為最小特徵要求的兩倍。
下圖顯示了 Android 11 和 Android 12 功能偵測之間的差異。提高最小特徵要求閾值會導致檢測到品質較差的特徵並對測量產生負面影響。
圖 2. Android 11 和 Android 12 之間的功能偵測差異
新測試
scene0/test_solid_color_test_pattern.py
針對 Android 12 啟用了新測試test_solid_color_test_pattern
。此測試針對所有相機啟用,如下表所述。
場景 | 測試名稱 | 第一 API 級別 | 描述 |
---|---|---|---|
0 | 測試實體顏色測試圖案 | 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 | 拜耳/莫諾 | 黑色的 |
性能等級測試
scene2_c/test_camera_launch_perf_class.py
驗證具有 scene2_c 臉部場景的前置和後置主相機的相機啟動時間均小於 500 毫秒。
scene2_c/test_jpeg_capture_perf_class.py
驗證具有 scene2_c 臉部場景的前置和後置主相機的 1080p JPEG 擷取延遲均小於 1 秒。