Camera2 了解捕获会话的输出质量决策过程
Camera2 understanding the capture session's outputs quality decision process
我正在编写一个应具有两个输出表面的应用程序,一个用于预览,一个用于某些 YUV 处理。对于处理,我想获得具有最少额外预处理的图像,知道大多数时候会有 4 倍缩放。因此,我从输出大小列表中选择了 select(getOutputSizes(ImageFormat.YUV_420_888)
),Size
尽可能接近 4 倍缩放(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE
除以 4)在最小的传感器尺寸。这样,我可以使用此 Size
应用“zoom”(CaptureRequest.SCALER_CROP_REGION
),因为我知道输出不会受到(额外的)插值。
预览大小根据处理输出的纵横比选择。
我的问题是我发现输出质量在很大程度上取决于 createCaptureSession (List<Surface> outputs, CameraCaptureSession.StateCallback callback, Handler handler)
方法中提供的输出表面。在比较来自内置相机应用程序的预览图像(以相同的缩放比例)和我的处理流(和预览)的图像时,我注意到了这一点。我的重复请求是基于 CameraDevice.TEMPLATE_PREVIEW
,所以我假设我会得到相同的质量。
文档没有提到任何关于质量的事情,他们只谈到了可能的流和目标组合,并提到必须设置管道。
While any of the sizes from getOutputSizes(int) can be used when a single output stream is configured, a given camera device may not be able to support all combination of sizes, formats, and targets when multiple outputs are configured at once.
和
Creating a session is an expensive operation and can take several hundred milliseconds, since it requires configuring the camera device's internal pipelines and allocating memory buffers for sending images to the desired targets.
我基本上发现,如果我在我的会话中添加一个具有最大输出大小(例如 JPEG:MAXIMUM)的虚拟表面(仅用于初始化它),那么我处理图像的质量就会提高很多更好。
虽然流配置允许它并且我的特殊上下文(4 倍缩放)适合 PREVIEW 最大尺寸,但我对这种方式感到不舒服。
LEGACY-level guaranteed configurations
PRIV:PREVIEW | YUV:PREVIEW | JPEG:MAXIMUM | Still capture plus in-app processing.
那么有谁知道发生了什么,质量是如何确定的以及如何获得可预测的输出?
- Phone 使用过:HUAWEI Mate 9
- 传感器活动阵列大小:3968x2976
- 裁剪尺寸:1536x863
幕后逻辑复杂device-specific,所以我一般只能提供一些指导方针:
如果您为会话请求的最大分辨率远低于相机支持的最大分辨率,相机通常会尝试 select 更 power-efficient 的模式来操作 - 基本上,只读取传感器的子采样图像,而不是全分辨率图像。这可以节省大量电量,这对于视频聊天应用、视频录制和不需要全分辨率的类似 long-running 任务非常重要。
如果相机设备 select 是二次采样传感器模式,数码变焦的质量将受到很大影响。不幸的是,无法告诉相机您将请求最大数字变焦以及 low-res 输出以获得传感器的窗口 1:1 切片。
因此,作为一个实际问题,如果您真的想要 1:1 裁剪区域的图像质量,而不是将其绘制到屏幕上,您可能最好使用 full-res 图片和裁剪自己。或者,如果您需要显示预览,配置一个您从未使用过的 full-res JPEG 输出(例如),强制相机进入 select 一个 full-size 传感器输出模式。
很难公开有关传感器模式配置的更多细节,因为可用传感器模式的限制和各种 bandwidth/power 限制很难用简单的方式描述,所以现在保证是只是你在流配置中得到了你要求的像素——如果你没有配置 full-res 输出,真的不能保证数字变焦无论如何都能提供相同的质量。
我正在编写一个应具有两个输出表面的应用程序,一个用于预览,一个用于某些 YUV 处理。对于处理,我想获得具有最少额外预处理的图像,知道大多数时候会有 4 倍缩放。因此,我从输出大小列表中选择了 select(getOutputSizes(ImageFormat.YUV_420_888)
),Size
尽可能接近 4 倍缩放(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE
除以 4)在最小的传感器尺寸。这样,我可以使用此 Size
应用“zoom”(CaptureRequest.SCALER_CROP_REGION
),因为我知道输出不会受到(额外的)插值。
预览大小根据处理输出的纵横比选择。
我的问题是我发现输出质量在很大程度上取决于 createCaptureSession (List<Surface> outputs, CameraCaptureSession.StateCallback callback, Handler handler)
方法中提供的输出表面。在比较来自内置相机应用程序的预览图像(以相同的缩放比例)和我的处理流(和预览)的图像时,我注意到了这一点。我的重复请求是基于 CameraDevice.TEMPLATE_PREVIEW
,所以我假设我会得到相同的质量。
文档没有提到任何关于质量的事情,他们只谈到了可能的流和目标组合,并提到必须设置管道。
While any of the sizes from getOutputSizes(int) can be used when a single output stream is configured, a given camera device may not be able to support all combination of sizes, formats, and targets when multiple outputs are configured at once.
和
Creating a session is an expensive operation and can take several hundred milliseconds, since it requires configuring the camera device's internal pipelines and allocating memory buffers for sending images to the desired targets.
我基本上发现,如果我在我的会话中添加一个具有最大输出大小(例如 JPEG:MAXIMUM)的虚拟表面(仅用于初始化它),那么我处理图像的质量就会提高很多更好。
虽然流配置允许它并且我的特殊上下文(4 倍缩放)适合 PREVIEW 最大尺寸,但我对这种方式感到不舒服。
LEGACY-level guaranteed configurations
PRIV:PREVIEW | YUV:PREVIEW | JPEG:MAXIMUM | Still capture plus in-app processing.
那么有谁知道发生了什么,质量是如何确定的以及如何获得可预测的输出?
- Phone 使用过:HUAWEI Mate 9
- 传感器活动阵列大小:3968x2976
- 裁剪尺寸:1536x863
幕后逻辑复杂device-specific,所以我一般只能提供一些指导方针:
如果您为会话请求的最大分辨率远低于相机支持的最大分辨率,相机通常会尝试 select 更 power-efficient 的模式来操作 - 基本上,只读取传感器的子采样图像,而不是全分辨率图像。这可以节省大量电量,这对于视频聊天应用、视频录制和不需要全分辨率的类似 long-running 任务非常重要。
如果相机设备 select 是二次采样传感器模式,数码变焦的质量将受到很大影响。不幸的是,无法告诉相机您将请求最大数字变焦以及 low-res 输出以获得传感器的窗口 1:1 切片。
因此,作为一个实际问题,如果您真的想要 1:1 裁剪区域的图像质量,而不是将其绘制到屏幕上,您可能最好使用 full-res 图片和裁剪自己。或者,如果您需要显示预览,配置一个您从未使用过的 full-res JPEG 输出(例如),强制相机进入 select 一个 full-size 传感器输出模式。
很难公开有关传感器模式配置的更多细节,因为可用传感器模式的限制和各种 bandwidth/power 限制很难用简单的方式描述,所以现在保证是只是你在流配置中得到了你要求的像素——如果你没有配置 full-res 输出,真的不能保证数字变焦无论如何都能提供相同的质量。