Android 9 推出了多相機的 API 支援 透過全新邏輯相機裝置 (由兩部以上的實體機組組成) 鏡頭裝置的朝相同方向移動。邏輯相機裝置 以單一 CameraDevice/CaptureSession 的形式,向應用程式公開發布, 與 HAL 整合式多鏡頭功能互動應用程式可選擇 存取及控管基礎實體相機串流、中繼資料和控制選項。
圖 1. 多鏡頭支援
在這個圖表中,不同的相機 ID 會以不同顏色標示。應用程式可以 同時串流播放每台實體攝影機的原始緩衝區。這個 可以設定個別的控制項,並接收來自不同的 實體相機
範例和來源
宣傳多機裝置時,請務必使用 多鏡頭邏輯。
相機用戶端可以查詢特定實體裝置的相機 ID
邏輯相機是由呼叫
getPhysicalCameraIds()
。
從結果中傳回的 ID 會用於控制實體裝置
分別管理
setPhysicalCameraId()
。
您可以從整份
叫用後的結果
getPhysicalCameraResults()
。
提出個別實體相機要求時,可能僅支援一部分實體
參數。如要接收支援的參數清單,開發人員可以呼叫
getAvailablePhysicalCameraRequestKeys()
。
實體相機串流僅支援非重新處理的要求,且 這僅適用於單色和海灣感應器
實作
支援檢查清單
如要在 HAL 端新增多鏡頭邏輯裝置:
- 新增
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
敬上 所有以兩個以上實體支援的邏輯相機裝置 使用過的相機 - 填入靜態值
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS
敬上 列出實體相機 ID 的清單 - 填入彼此之間關聯所需的深度相關靜態中繼資料
實體攝影機串流影像像素:
ANDROID_LENS_POSE_ROTATION
、ANDROID_LENS_POSE_TRANSLATION
,ANDROID_LENS_INTRINSIC_CALIBRATION
,ANDROID_LENS_DISTORTION
、ANDROID_LENS_POSE_REFERENCE
。 設定靜態
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE
敬上 中繼資料欄位以便:ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE
: 如果是處於主要模式的感應器,則沒有硬體快門/曝光同步。ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED
: 針對在主要次要模式下的感應器,硬體快門/曝光同步。
填入
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS
敬上 且包含個別實體相機支援的參數清單 如果邏輯裝置不支援個別要求,則可留空。如支援個別要求,請處理並套用
physicalCameraSettings
敬上 可能會做為擷取要求的一部分到達,並附加physicalCameraMetadata
。 。適用於相機 HAL 裝置 3.5 版 (已推出於 Android 10 以上版本),請填入
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID
敬上 結果金鑰。這個結果金鑰會擷取目前進行中實體相機的 ID 邏輯性相機
搭載 Android 9 的裝置必須在相機裝置上啟用 支援將一個邏輯 YUV/RAW 串流替換成 相同大小 (不適用於 RAW 串流) 和兩個實體提供的格式相同 相機上不適用於搭載 Android 10 的裝置。
搭載 Android 10 且
相機 HAL 裝置版本為
3.5
相機裝置必須支援
isStreamCombinationSupported
敬上
讓應用程式查詢特定串流組合是否包含
實體串流。
串流設定對應
邏輯攝影機必須具備以下攝影機裝置所需的串流組合:
所需的硬體等級
CameraDevice.createCaptureSession
。
串流設定對應中的所有串流都必須是邏輯串流。
適用於支援 RAW 功能且具備實體子相機的邏輯相機裝置 設定不同的 RAW 串流時, 邏輯相機裝置不得切換至不同實體的子攝影機 感應器大小這可確保現有的 RAW 擷取應用程式不會中斷。
為了充分利用 HAL 實作的光學變焦功能 實體子相機在 RAW 拍攝期間,應用程式必須 設定實體子相機串流,而不是 RAW 串流。
保證串流組合
邏輯相機及底層實體攝影機必須確保 必要的串流組合 應用程式層級所需的資源
邏輯相機裝置的運作方式應與實體相機相同 判斷裝置是否相容我們建議 具備個別實體相機的超集功能。
在搭載 Android 9 的裝置上, 串流組合,邏輯相機必須支援:
將一個邏輯 YUV_420_888 或原始串流取代為兩個實體串流 大小和格式都相同,而且都是使用不同的實體相機 但是實體相機可支援的大小和格式
新增兩個原始串流,每個實體相機各一個串流 (如果是邏輯相機的話) 並未宣傳 RAW 功能,但基礎的實體相機卻有。 這通常是因為實體攝影機的感應器大小不同。
以實體串流取代相同大小和 格式。避免在擷取影格速率時 實體和邏輯串流的最短影格持續時間相同。
效能和電源注意事項
成效:
- 設定及串流實體串流可能會拖慢 邏輯相機因資源限製而擷取率。
- 套用實體相機設定可能會拖慢拍攝速度, 所有底片相機的影格速率不同
電源:
- HAL 的電源最佳化功能會繼續在預設情況下運作。
- 設定或要求實體串流可能會覆寫 HAL 的內部 電源最佳化,從而增加耗電量。
自訂
您可以透過下列方式自訂裝置實作方式。
- 邏輯相機裝置融合的輸出內容完全取決於 HAL 。決定融合邏輯串流如何衍生自 實體相機和 Android 相機保持公開透明 這個架構的重點在於
- 您可以選擇支援個別的實體要求和結果。 這類請求中的可用參數集也完全取決於 特定 HAL 實作項目
- 從 Android 10 開始,HAL 可以減少
可由應用程式直接開啟的相機
宣傳以下項目的部分或全部 PHYSICAL_ID:
getCameraIdList
。 正在撥打getPhysicalCameraCharacteristics
然後傳回實體相機的特性
驗證
邏輯多鏡頭裝置必須像其他一般鏡頭一樣傳送相機 CTS。
如需指定這類裝置的測試案例,請前往
LogicalCameraDeviceTest
敬上
後續課程我們將逐一介紹
預先訓練的 API、AutoML 和自訂訓練
這三項 ITS 測試的目標是多鏡頭系統, 融合圖片:
scene1/test_multi_camera_match.py
scene4/test_multi_camera_alignment.py
sensor_fusion/test_multi_camera_frame_sync.py
場景 1 和場景 4 使用
ITS 收納盒測試
才華test_multi_camera_match
測試會宣告
將兩部攝影機同時啟用時,影像中央相符。
test_multi_camera_alignment
測試會宣告相機間距、方向、
和變形參數正確載入如果多機拍攝系統
配備廣角 FoV 攝影機 (>90o 以上),則必須使用 2 版的 ITS 包裝盒。
Sensor_fusion
是第二個測試 rig,可執行重複且預先指定的手機
動作及斷言陀螺儀和影像感應器的時間戳記相符,以及
多鏡頭影格會保持同步
你可以在 AcuSpec, Inc. 購買所有包裝盒 (www.acuspecinc.com、 fred@acuspecinc.com) 和 MYWAY 製造 (www.myway.tw、sales@myway.tw)。 此外,您也可以透過 West-Mark 購買最新的 ITS 包裝盒 (www.west-mark.com、 dgoodman@west-mark.com)。
最佳做法
充分利用多鏡頭提供的功能,同時保持 應用程式相容性,請按照這些最佳做法實作邏輯 多鏡頭裝置:
- (Android 10 以上版本) 隱藏下列位置的實體子相機:
getCameraIdList
。 這會減少可直接開啟的相機數量 應用程式也不需要設定複雜的相機選取邏輯。 - (Android 11 以上版本) 適用於多鏡頭邏輯
裝置支援光學變焦,請實作
ANDROID_CONTROL_ZOOM_RATIO
API,以及使用ANDROID_SCALER_CROP_REGION
。ANDROID_CONTROL_ZOOM_RATIO
敬上 可讓裝置縮小畫面,同時維持更精確的準確度。在本例中 HAL 必須調整ANDROID_SCALER_CROP_REGION
的座標系統,ANDROID_CONTROL_AE_REGIONS
,ANDROID_CONTROL_AWB_REGIONS
,ANDROID_CONTROL_AF_REGIONS
、ANDROID_STATISTICS_FACE_RECTANGLES
、 和ANDROID_STATISTICS_FACE_LANDMARKS
以處理縮放後 做為感應器使用陣列的視野。如要進一步瞭解ANDROID_SCALER_CROP_REGION
敬上 可與ANDROID_CONTROL_ZOOM_RATIO
搭配運作 請參閱「camera3_crop_reprocess#cropping
」。 - 適用於配備不同實體攝影機的多鏡頭裝置
以及宣傳支援的特定值
或控制項的範圍,只有在整個縮放範圍支援 值時
或是範圍舉例來說,如果邏輯相機是由超廣角鏡頭組成
廣角和望遠鏡頭:
- 如果實體攝影機使用中的陣列大小不同,
相機 HAL 必須負責將實體攝影機的主動陣列
ANDROID_SCALER_CROP_REGION
的邏輯相機動態陣列,ANDROID_CONTROL_AE_REGIONS
,ANDROID_CONTROL_AWB_REGIONS
,ANDROID_CONTROL_AF_REGIONS
、ANDROID_STATISTICS_FACE_RECTANGLES
、 和ANDROID_STATISTICS_FACE_LANDMARKS
因此,從應用程式的角度來看 座標系統是邏輯相機的有效陣列大小。 - 如果廣角和望遠鏡頭支援自動對焦功能,但支援超廣角鏡頭, 相機為定焦,請確認邏輯相機具有自動對焦功能 聯絡。HAL 必須模擬超廣角鏡頭的自動對焦狀態機器 所以當應用程式縮小到超廣角鏡頭時 底層實體相機是應用程式透明的 以及支援自動對焦模式的自動對焦狀態機器 。
- 如果廣角和望遠鏡頭支援 4K @ 60 fps,
超廣角鏡頭僅支援 4K @ 30 fps 或 1080p @ 60 fps,但
不是 4K @ 60 fps,請確認邏輯相機未公告 4K @
採用 60 fps 支援的串流格式。這麼做可保證
邏輯相機功能的完整性,確保應用程式不會
若是每秒 4K @ 60 FPS,
ANDROID_CONTROL_ZOOM_RATIO
敬上 小於 1 的值。
- 如果實體攝影機使用中的陣列大小不同,
相機 HAL 必須負責將實體攝影機的主動陣列
- 搭載 Android 10 的多鏡頭邏輯
則不一定要支援含有實體串流的串流組合。
如果 HAL 支援與實體串流搭配使用:
- (Android 11 以上版本) 為了更妥善地運用 例如立體聲和動作追蹤的深度等 實體串流輸出內容的規模。 但是,如果實體串流和邏輯串流來自相同的 硬體上的限制可能會導致視野 實體串流和邏輯串流相同
- 如要解決多個實體串流造成的記憶體壓力,
確認應用程式使用
discardFreeBuffers
釋出免費緩衝區 (取用端釋出的緩衝區, 但尚未由生產端從佇列中移除) 閒置一段時間。 - 萬一出現實體攝影機畫面時
在同一個要求中附加,請確保應用程式使用
surface group
以便一個緩衝區佇列 回到兩個應用程式面向的介面 減少記憶體用量