如何在Android相机2 API中锁定对焦?

16

在我的自定义相机找到焦点后,我尝试锁定焦点。首先,将它的自动对焦模式设置为自动:

builder.set(CaptureRequest.CONTROL_AF_MODE,
                    CaptureRequest.CONTROL_AF_MODE_AUTO);

在触摸预览后,它会找到焦距,然后我必须使用此代码锁定AF和AE:

builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
builder.set(CaptureRequest.CONTROL_AE_LOCK, true);

锁定自动曝光在任何设备上都能正常工作。锁定自动对焦在Nexus5和Nexus 5x上可以工作。但是对于三星S5和S6,它仍在尝试搜索焦点。

最佳的锁定焦点的方式是什么?

2个回答

31
为了锁定自动对焦(AF),您需要注意只使用capture()而不是repeatingRequest()请求一次AF_TRIGGER(否则它将进入af请求循环,并且会一直尝试对焦,但某些Nexus在其FW中修复了这个问题,因此一些设备如Nexus 5即使不应该也能够良好地对焦)。
因此,正确的顺序应该是:
  • 通过session.setRepeatingRequest()CONTROL_AF_MODE设置为CONTROL_AF_MODE_AUTO,如果需要,还可以设置AF_REGIONSAE_REGIONS

  • 等待并检查CaptureCallback中的totalCaptureRequest以确认CONTROL_AF_MODE已设置为auto。

  • 在构建器中设置AF_TRIGGER_STARTCONTROL_AF_MODE_AUTO,但这一次不要使用session.setRepeatingRequest(),而是使用session.capture()

  • 立即在此之后将AF_TRIGGER设置为AF_TRIGGER_IDLE(不是取消!)并再次使用session.setRepeatingRequest()以及CONTROL_AF_MODE_AUTO

  • 等待直到对焦完成,您将收到FOCUSED_LOCKEDNOT_FOCUSED_LOCKED

CONTROL_AF_MODE处于连续拍照而不是自动模式时,PASSIVE_FOCUSED状态才会出现。
在执行触发操作之前,请务必确保处于自动对焦模式。

在所有触发器(包括 CONTROL_AE_PRECAPTURE_TRIGGER)中始终使用session.capture(),但是请始终记得在session.repeatingRequest()中将触发器设置为 IDLE (不要取消)。


非常棒的解释!谢谢你。 - mudin
如果您能查看一下这个问题的话,那就太好了:http://stackoverflow.com/questions/42090124/searching-focus-keeps-failing-with-external-lens-camera2-api-in-android - mudin
嗯,抱歉我没有使用过任何外部镜头,无法帮助你 :( - Yamidragut
1
在这里,您的意思是“通过检查来自CaptureCallback的totalCaptureRequest,等待检查CONTROL_AF_MODE是否已经处于自动模式。” @Yamidragut - Vikas
当您执行session.setRepeatingRequest()时,第二个参数是一个CameraCaptureSession.CaptureCallback。您必须创建一个,在onCaptureCompleted()回调中获取TotalCaptureResult。然后,您可以处理该TotalCaptureResult以获取不同类型的信息,例如AF_MODE或当前的AE_STATE等。例如,您可以通过调用result.get(CaptureResult.CONTROL_AF_MODE)来检索当前的AF_MODE。 请注意,某些值在某些帧中可能为null,具体取决于设备,因此始终检查可空性。 - Yamidragut
@Yamidragut 你能检查一下这个问题吗?https://stackoverflow.com/questions/41128863/android-set-camera2-focus-only-once-on-beginning-of-timelapse? - Shivam Pokhriyal

5

您无法将焦点集中在CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE上。

您应该将AF模式设置为CONTROL_AF_MODE_AUTO,并在AF触发期间等待FOCUSED_LOCKED状态。您可以在此处了解Android对焦机制的工作方式。


是的,我也在做同样的事情。首先是CONTROL_AF_MODE_AUTO,等待直到AF状态为FOCUSED_LOCKEDPASSIVE_FOCUSED。然后我将AF触发器设置为CONTROL_AF_TRIGGER_CANCEL,对于Nexus,将AF模式设置为CONTROL_AF_MODE_CONTINUOUS_PICTURE,对于三星S5 / S6,则将其设置为CONTROL_AF_MODE_OFF - mudin
1
但我不确定哪种方法是正确的,因为它在不同的设备上表现不同。 - mudin
1
如果我将 CONTROL_AF_MODE_OFF 设为参数,在三星手机上运行良好。但在 Nexus5/5x 上会变得模糊。 - mudin
2
三星设备使用自己的固件与相机API协同工作,如果您想了解它们的工作原理,可以查看它们的自定义相机实现:http://developer.samsung.com/galaxy/camera - Francisco Durdin Garcia
2
每个固件都是不同的,公司通常会改变他们的HAL(https://en.wikipedia.org/wiki/HAL_(software))的工作方式,以便更容易地在应用程序层面上实现。但这也会导致其他人想要在其设备中使用公共“API”如“camera2”时出现问题。我建议您基于使用“CameraCharacteristics”检索到的硬件功能来制作您的应用程序,并尽可能少地实现“检查设备”条件,因为每个设备更新都可能改变它的工作方式。但硬件不会改变。 - Francisco Durdin Garcia
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接