我正在构建一款专为 Pixel 3 XL 设计的相机。我正在使用camera2 API,并且想使用启用了 HDR 和/或夜间模式的前置摄像头拍照。这是我设置捕获请求的代码 fragment :
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+ 拍摄时类似的功能。有谁知道我是否需要做更多的事情而不仅仅是在捕获请求中设置标志来获得所需的行为?
最佳答案
在 Android 中,图像处理算法可以在 HAL 级别以及应用程序级别实现。 Android框架位于HAL和应用程序之间,提供与相机交互的接口(interface)。当您调用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 请求 YUV
或 RAW
图像,并在应用程序级别通过 HDR 或夜间模式算法运行它们。
TL;DR; Google Pixel 的 native 摄像头很可能在camera2 返回的图像之上进行更多的图像处理,因此无法通过设置任何配置来单独利用camera2 来复制它。
关于Android 10 (api 29) 如何启用 HDR 和夜间模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60089819/