首页 > 解决方案 > Android 10 (api 29) 如何启用 HDR 和夜间模式

问题描述

我正在构建一个专门用于 Pixel 3 XL 的相机。我正在使用 camera2 API,并想使用启用 HDR 和/或夜间模式的前置摄像头拍照。这是在我设置捕获请求时截取的代码:

 final CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
 captureBuilder.addTarget(mStillImageReader.getSurface());
 captureBuilder.set(CaptureRequest.CONTROL_SCENE_MODE, CameraMetadata.CONTROL_SCENE_MODE_HDR);
 captureBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CameraMetadata.CONTROL_AWB_MODE_AUTO);
 captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
 captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_AUTO);
 captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_SCENE_MODE_NIGHT);
 captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, 0);

...
 mCaptureSession.capture(captureBuilder.build(), CaptureCallback, mBackgroundHandler);

当 Android 的原生相机应用设置为夜间模式或 HDR+ 拍摄时,我希望能得到一些接近它的功能。有谁知道我是否需要做的不仅仅是在捕获请求中设置标志以获得所需的行为?

标签: androidandroid-camera

解决方案


在 Android 中,图像处理算法可以在 HAL 级别以及应用程序级别实现。Android 框架位于 HAL 和应用程序之间,并提供与相机交互的接口。当您调用该set方法时:

captureBuilder.set(
    CaptureRequest.CONTROL_SCENE_MODE,
    CameraMetadata.CONTROL_SCENE_MODE_HDR);

在将图像返回给应用程序之前,您请求 HAL 执行 HDR。请注意:HAL 由 OEM(或供应商)实现(可以将 Pixel 视为 OEM),实现不同的CONTROL_SCENE_MODES. 您可以并且应该使用以下方法查询可用的控制模式:

// Get the camera charecteristics for current camera
CameraCharacteristics cameraCharacteristics = getCameraCharecteristics(cameraFacing);

int[] modes = cameraCharacteristics.get(
                CameraCharacteristics.CONTROL_AVAILABLE_SCENE_MODES);

// Check if the modes array has the SCENE MODE you wish to apply
// ... by iterating through the list.

如果您在 Pixel 3 XL 上运行此程序,您可能无法获得 HDR 支持。如果我错了,请纠正我。

如果您不想为 HDR 和夜间模式编写自己的算法,则必须依赖可用的场景模式,最好是查询和验证。或者,您可以从相机 2 请求YUVRAW图像,并在应用程序级别通过 HDR 或夜间模式算法运行它们。

TL;博士; Google Pixel 的原生相机很可能在 camera2 返回的图像之上进行更多的图像处理,因此无法通过设置任何配置单独利用 camera2 来复制它。


推荐阅读