【问题标题】:How to lock focus in camera2 api, android?如何在camera2 api,android中锁定焦点?
【发布时间】:2018-11-19 16:22:24
【问题描述】:

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

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);

锁定 AE 在任何设备上都可以正常工作。锁定 AF 正在 Nexus5 和 Nexus 5x 上运行。但三星 S5 和 S6 一直在尝试搜索焦点。

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

【问题讨论】:

    标签: android android-camera2


    【解决方案1】:

    为了锁定 AF,您必须通过使用 capture() 而不是 repeatingRequest() 只请求一次 AF_TRIGGER(如果不是,它会进入 af 请求循环并始终尝试聚焦,但是一些 nexus 在其 FW 中解决了这个问题,所以像 Nexus 5 这样的一些设备即使不应该也能很好地聚焦)

    所以,正确的顺序是:

    • 如果需要,将CONTROL_AF_MODE 设置为CONTROL_AF_MODE_AUTO(通过session.setRepeatingRequest())和AF_REGIONSAE_REGIONS

    • 等到您通过检查CaptureCallback 中的totalCaptureRequest 来检查CONTROL_AF_MODE 是否已处于自动状态。

    • 在构建器中设置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

    PASSIVE_FOCUSED 状态仅在CONTROL_AF_MODE 处于连续画面而非自动状态时!

    在执行触发器之前,请注意真正处于自动对焦模式。

    您应该始终将 session.capture() 与所有触发器一起使用(也应使用 CONTROL_AE_PRECAPTURE_TRIGGER),但在此之后始终记住将触发器放在 IDLE(而不是取消)在 session.repeatingRequest()

    【讨论】:

    • 非常棒的解释!谢谢。
    • 如果你看看这个问题stackoverflow.com/questions/42090124/…,那就太好了
    • 嗯,对不起,我没有使用任何外接镜头,我帮不了你:(
    • 这就是您所说的“等到您通过检查 CaptureCallback 中的 totalCaptureRequest 来检查 CONTROL_AF_MODE 是否已经处于自动状态”的意思。 @Yamidragut
    • 当您执行session.setRepeatingRequest() 时,第二个参数是CameraCaptureSession.CaptureCallback。您必须创建一个并在onCaptureCompleted() 回调中获得TotalCaptureResult。然后您可以处理该TotalCaptureResult 以获得不同类型的信息,例如AF_MODE 或当前AE_STATE 等等。例如,您可以通过调用result.get(CaptureResult.CONTROL_AF_MODE) 来检索当前的AF_MODE。考虑到某些帧中的某些值可能为空,具体取决于设备,因此请始终检查可空性
    【解决方案2】:

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

    在触发 AF 期间,您应该将 AF 模式设置为 CONTROL_AF_MODE_AUTO 并等待 FOCUSED_LOCKED 状态。你可以在enter link description here上查看Android对焦机的工作原理

    【讨论】:

    • 是的,我也在做同样的事情。首先是CONTROL_AF_MODE_AUTO ,等到AF状态为FOCUSED_LOCKEDPASSIVE_FOCUSED。然后我将AF触发器设置为CONTROL_AF_TRIGGER_CANCEL,AF模式设置为CONTROL_AF_MODE_CONTINUOUS_PICTURE ,用于Nexus,CONTROL_AF_MODE_OFF设置为三星s5/s6
    • 但我不确定哪种方法是正确的,因为它在不同的设备之间运行。
    • 如果我设置为CONTROL_AF_MODE_OFF ,它适用于三星。但在 Nexus5/5x 中变得模糊
    • 三星设备作为他们自己的固件与相机 API 一起工作,如果你想看看他们是如何工作的,你应该检查他们的自定义相机实现:developer.samsung.com/galaxy/camera
    • 每个固件都不同,公司通常会更改其 HAL(en.wikipedia.org/wiki/HAL_(software)) 的工作方式,以便更轻松地在应用程序级别上实施。但是,当其他人想要在他们的设备中使用公共API(如camera2)时,这也会导致问题。我建议您根据您使用CameraCharacteristics 检索到的hardware capabilities 制作您的应用程序,并尝试尽可能少地实现“检查设备”条件,因为每次设备更新都会改变它的工作方式。但硬件没有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    相关资源
    最近更新 更多