多摄像头支持
目录
Android 9 通过一个新的逻辑摄像头设备(该设备由两个或两个以上指向同一方向的物理摄像头设备组成)引入了对多摄像头设备的 API 支持。该逻辑摄像头设备作为单个 CameraDevice/CaptureSession 提供给应用,从而允许与集成了 HAL 的多摄像头功能互动。应用可以选择访问和控制底层物理摄像头数据流、元数据和控件。
![Multi-camera support](https://i-blog.csdnimg.cn/blog_migrate/463826d476691c191562a267599856a7.png)
在此图中,不同的摄像头 ID 用不同颜色标识。应用可以同时流式传输来自每个物理摄像头的原始缓冲区。您也可以设置单独的控件并从不同的物理摄像头单独接收元数据。
示例和来源
必须通过逻辑多摄像头功能播发多摄像头设备。
摄像头客户端可以通过调用 getPhysicalCameraIds()
,查询构成特定逻辑摄像头的物理设备的摄像头 ID。随结果返回的 ID 之后会用于通过 setPhysicalCameraId()
单独控制各个物理设备。可以通过调用 getPhysicalCameraResults()
从完整结果中查询此类单个请求的结果。
单个物理摄像头请求可能仅支持有限的部分参数。为了接收受支持参数的列表,开发者可以调用 getAvailablePhysicalCameraRequestKeys()
。
只有非重新处理请求以及单色和 Bayer 传感器支持物理摄像头数据流。
实现
支持核对清单
要在 HAL 端添加逻辑多摄像头设备,请执行以下操作:
- 为由两个或两个以上物理摄像头(这些摄像头也会提供给应用)提供支持的任何逻辑摄像头设备添加
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
功能。 - 使用物理摄像头 ID 列表填充静态
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS
元数据字段。 - 填充在物理摄像头数据流的像素之间建立关联所需的深度相关静态元数据:
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 中引入)或更高版本,请使用支持逻辑摄像头的当前有效物理摄像头的 ID 填充
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID
结果密钥。
对于搭载 Android 9 的设备,摄像头设备必须支持将一个逻辑 YUV/RAW 数据流替换为来自两个物理摄像头的大小(不适用于 RAW 数据流)和格式相同的物理数据流。这并不适用于搭载 Android 10 的设备。
对于搭载 Android 10(其中相机 HAL 设备版本为 3.5)或更高版本的设备,摄像头设备必须支持 isStreamCombinationSupported
,以便应用查询包含物理数据流的特定数据流组合是否受支持。
数据流配置映射
对于逻辑摄像头,特定硬件级别的摄像头设备的强制性数据流组合与 CameraDevice.createCaptureSession
中所需的数据流组合相同。数据流配置映射中的所有数据流都必须是逻辑数据流。
对于支持 RAW 功能、物理子摄像头大小不同的逻辑摄像头设备,如果应用配置逻辑 RAW 数据流,则逻辑摄像头设备不得切换到具有不同传感器尺寸的物理子摄像头。这样可以确保现有 RAW 捕获应用不会中断。
要在 RAW 捕获期间通过在物理子摄像头之间进行切换来利用 HAL 实现的光学变焦,应用必须配置物理子摄像头数据流(而不是逻辑 RAW 数据流)。
有保证的数据流组合
逻辑摄像头及其底层物理摄像头都必须保证其设备级别所需的强制性数据流组合。
逻辑摄像头设备的运行方式应该与物理摄像头设备相同,具体取决于其硬件级别和功能。建议将其特征集设为单个物理摄像头的特征集的超集。
在搭载 Android 9 的设备上,对于每个有保证的数据流组合,逻辑摄像头必须支持:
-
将一个逻辑 YUV_420_888 或原始数据流替换为两个相同大小和格式的物理数据流(每个数据流来自不同的物理摄像头),只要物理摄像头支持这种大小和格式就可以。
-
添加两个原始数据流(在每个物理摄像头中各添加一个),条件是逻辑摄像头不播发 RAW 功能,但底层物理摄像头播发该功能。当两个物理摄像头具有不同的传感器尺寸时,通常会出现这种情况。
-
使用物理数据流代替大小和格式相同的逻辑数据流。当物理数据流和逻辑数据流的最小帧时长相同时,这么做就不会减慢捕获的帧速率。
性能和功率考虑因素
-
性能:
- 由于资源限制,配置和流式传输物理数据流可能会降低逻辑摄像头的捕获速率。
- 如果将底层摄像头设为不同的帧速率,则应用物理摄像头设置可能会降低捕获速率。
-
电源:
- HAL 的电源优化在默认情况下继续有效。
- 配置或请求物理数据流可能会替换 HAL 的内部电源优化并消耗更多电量。
自定义
您可以通过以下方式自定义设备实现。
- 逻辑摄像头设备的融合输出完全取决于 HAL 实现。关于如何从物理摄像头派生融合逻辑数据流的决定对于应用和 Android 相机框架来说都是透明的。
- 可以选择支持单个物理请求和结果。此类请求中的可用参数集也完全取决于特定的 HAL 实现。
- 从 Android 10 开始,HAL 可以选择不在
getCameraIdList
中播发部分或所有 PHYSICAL_ID,从而减少应用可以直接打开的摄像头数量。调用getPhysicalCameraCharacteristics
必须返回物理摄像头的特性。
验证
逻辑多摄像头设备必须像任何其他普通摄像头一样通过摄像头 CTS。可以在 LogicalCameraDeviceTest
模块中找到针对此类设备的测试用例。
以下三个 ITS 测试针对多摄像头系统,以便于正确融合图像:
scene1/test_multi_camera_match.py
scene4/test_multi_camera_alignment.py
sensor_fusion/test_multi_camera_frame_sync.py
scene1 和 scene4 测试使用盒装 ITS 测试装置运行。当两个摄像头都启用时,test_multi_camera_match
测试会声明图像中心的亮度匹配。test_multi_camera_alignment
测试会声明摄像头间距、方向和失真参数已正确加载。如果多摄像头系统包含广视野摄像头(大于 90o),则需要 rev2 版 ITS 包装盒。
Sensor_fusion
是另一个测试装置,它可以实现规定的重复手机动作,并声明陀螺仪和图像传感器时间戳匹配以及多摄像头帧保持同步。
所有测试盒均由 AcuSpec, Inc. (www.acuspecinc.com,fred@acuspecinc.com) 和 MYWAY Manufacturing (www.myway.tw,sales@myway.tw) 提供。此外,rev1 ITS 测试盒可从 West-Mark (www.west-mark.com,dgoodman@west-mark.com) 购买。
转自:https://source.android.google.cn/devices/camera/multi-camera?hl=en