在我的Android相机应用程序中,我正在使用Camera2 API。该应用程序不显示Camera的预览,并且我已经以某种方式实现了它,当按下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
的CameraCaptureSession.CaptureCallback
方法。我在这里缺少什么要点?我是否需要实现一个线程来等待相机对焦,这将在按下“拍照”按钮时开始。
请注意,此应用程序没有相机预览。
最佳答案
您仅发送一个捕获请求吗?还是在后台运行重复请求,然后仅在按下按钮时发出高分辨率捕获?
前者并不能真正起作用-您必须要有大量的请求才能使自动曝光,对焦和白平衡算法收敛到良好的值。单次拍摄将无法正确测光或聚焦。
请看一下Camera2Basic示例;如果仅用SurfaceTexture替换该示例中的TextureView(给它一个随机的纹理ID,并且不调用updateTexImage),则无法进行预览。但是它可以正确实现聚焦和预捕获触发,这对您至关重要。对于一个触发器,仅应在一个请求上设置触发器,然后您确实需要观看捕获结果,以查看曝光/对焦状态何时变为FOCUSED或CONVERGED。
我还建议使用CONTINUOUS_PICTURE对焦模式,而不要使用AUTO;它可能会更快地为您提供聚焦的图像。
关于android - Android Camera2:自动对焦和曝光,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46823116/