相機影像測試套件 (ITS) 是用於對 Android 相機產生的影像運行測試的框架。 ITS 中每次測試的總體目標是以特定方式配置相機、捕捉一張或多張照片,並檢查這些照片是否包含預期的影像資料。許多測試需要將相機指向特定的目標圖表或以特定的強度照明。
ITS 位於cts/apps/CameraITS
中的 CTS Verifier 測試工具中。設備必須透過與相機框架為第三方應用程式作為 CTS 子集宣傳的支援功能相對應的 ITS 測試。
設定
要執行 ITS 測試,必須設定以下內容:
- 被測設備 (DUT)
- 主機(例如,Linux 桌上型電腦或筆記型電腦)
- 相機拍攝的場景
被測設備 (DUT) 設定
若要設定 DUT,請執行以下步驟:
- 透過 USB 將 DUT 連接到主機。
- 授予主機透過 ADB 存取 DUT 的權限。
將 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 測試。
打開 CTS Verifer 應用程式。在測試選單中,選擇Camera ITS Test 。
在主機上,從
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 檔案擷取相關的測試併計為通過。
若要確認測試已符合測試要求,請點選綠色複選標記按鈕。 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 中。
若要為每個相機產生雜訊模型,請執行
tools
目錄中的dng_noise_model.py
腳本。這將輸出一個 C 程式碼片段。有關如何設定相機和捕獲環境的更多信息,請參閱tools
目錄中的DngNoiseModel.pdf
文件。若要實現裝置的雜訊模型,請將 C 程式碼片段剪下並貼上到相機 HAL 中。
噪音模型驗證
tests/scene1_1/test_dng_noise_model.py
自動化 ITS 測試透過驗證相機資料中提供的鏡頭曝光和增益的雜訊值是否正確來驗證雜訊模型。