Android Camera2:自动对焦和曝光

时间:2017-10-19 05:03:02

标签: android android-camera2

在我的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内的方法中实施一些检查?

我还注意到,在onImageAvailable中调用ImageReader.OnImageAvailableListener时,onCaptureProgressed的{​​{1}}方法未被触发。

我在这里缺少什么?我是否需要实现一个线程来等待相机聚焦,这将在按下拍照按钮时开始。

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

1 个答案:

答案 0 :(得分:5)

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

前者不会真正起作用 - 您必须有一系列请求才能使自动曝光,聚焦和白平衡算法收敛到良好的值。单个捕获将无法正确计量或聚焦。

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

我还建议使用CONTINUOUS_PICTURE焦点模式而不是AUTO;它可能会更快地为您提供聚焦图像。