Android Camera2:自动对焦和曝光

Android Camera2: Auto Focus and Exposure

在我的 Android 相机应用程序中,我使用的是 Camera2 API。该应用程序不显示相机的预览,我已经以某种方式实现了它,当按下 UI 上的按钮时,它会拍摄图像。但问题在于自动对焦和自动曝光。简而言之,我需要始终将相机聚焦在其视图的中间。因此,在构建请求时,我添加了以下属性:

captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);
captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
captureBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_AUTO);
captureBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START);
captureBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CameraMetadata.CONTROL_AE_PRECAPTURE_TRIGGER_START);  

但问题仍然是图像没有聚焦。

我有几个问题:

我是否需要在 CameraCaptureSession.CaptureCallback 中的方法中执行一些检查?

我还注意到,在 ImageReader.OnImageAvailableListener 中调用 onImageAvailable 时,并未触发 CameraCaptureSession.CaptureCallbackonCaptureProgressed 方法。

我在这里遗漏了什么要点?我是否需要实现一个线程来等待相机对焦,这将在按下拍照按钮时启动。

请注意,此应用程序没有相机预览功能。

您是否只发送一个捕获请求?还是您 运行 在后台重复请求,然后仅在按下按钮时发出高分辨率捕获?

前者不会真正起作用 - 您必须有一个请求流才能使自动曝光、对焦和白平衡算法收敛到良好的值。单次拍摄不会被正确计量或聚焦。

请看一下Camera2Basic样本;如果您仅用 SurfaceTexture 替换该示例中的 TextureView(给它一个随机纹理 ID 并且不调用 updateTexImage),那么您将无法进行预览。但它正确地实现了聚焦和预捕获触发,这对您来说至关重要。一方面,触发器只能根据一个请求设置,然后您确实需要观察返回的捕获结果以查看曝光/聚焦状态何时更改为 FOCUSED 或 CONVERGED。

我还推荐 CONTINUOUS_PICTURE 对焦模式而不是 AUTO;它可能会让您更快地获得聚焦图像。