Android Camera2 API - 检测我们何时对焦

7

所以,我成功地使用旧相机创建了我想要的功能,并按照自己的方式实现了它。

通过mCamera.autoFocus(autoFocusCallback);我可以检测到焦点并在预览模式下运行所需的代码。

现在,我很难理解如何在camera2 API中实现相同的功能。我的第一个想法是使用

        private void process(CaptureResult result) {
        switch (mState) {
            case STATE_PREVIEW: {
                // We have nothing to do when the camera preview is working normally.
                int afState = result.get(CaptureResult.CONTROL_AF_STATE);
                //if (CaptureResult.CONTROL_AF_STATE == afState) {
                    Log.d("SOME KIND OF FOCUS", "WE HAVE");
                //}

                break;
            }
}

但我找不到任何状态来告诉我我们已经获得了焦点。有人知道如何使用Camera2 API实现吗?

2个回答

5

对于那些感兴趣的人,我最终得出了这个混合方案:

private CameraCaptureSession.CaptureCallback mCaptureCallback
        = new CameraCaptureSession.CaptureCallback() {

    private void process(CaptureResult result) {
        switch (mState) {
            case STATE_PREVIEW: {

                int afState = result.get(CaptureResult.CONTROL_AF_STATE);
                if (CaptureResult.CONTROL_AF_TRIGGER_START == afState) {
                    if (areWeFocused) {
                        //Run specific task here
                    }
                }
                if (CaptureResult.CONTROL_AF_STATE_PASSIVE_FOCUSED == afState) {
                    areWeFocused = true;
                } else {
                    areWeFocused = false;
                }

                break;
            }
        }
    }

   @Override
    public void onCaptureProgressed(CameraCaptureSession session, CaptureRequest request,
                                    CaptureResult partialResult) {
        process(partialResult);
    }

    @Override
    public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,
                                   TotalCaptureResult result) {
        process(result);
    }
};

它的运行效果相当不错 :)


如果我理解正确的话,这个值在基本上应该是 false 吗? - Sirop4ik
我遇到了这样的情况:result.get(CaptureResult.CONTROL_AF_STATE);总是返回0... 0表示CaptureResult.CONTROL_AF_STATE_INACTIVE。我在三星S5上测试时遇到了这个问题...但是相同的代码在魅族MX5上总是返回1或2...这是什么区别呢? - Sirop4ik
也许您知道如何解决我的问题,当相机对焦时我该如何拍照?这是我的问题链接:http://stackoverflow.com/questions/40185407/how-to-take-picture-only-if-image-in-focus-camera-2-api。提前致谢! - Sirop4ik
有人可以提供这个的 Kotlin 版本吗? - Tooniis

3
您已经基本掌握了。您可以在此处找到可检查的状态列表及其转换。
这取决于您使用的CONTROL_AF_MODE是什么,但通常您会检查FOCUSED_LOCKEDPASSIVE_FOCUSED,尽管您可能需要为NOT_FOCUSED_LOCKEDPASSIVE_UNFOCUSED设置情况,以防相机无法对场景进行对焦。

CONTROL_AF_MODE 是 CONTROL_AF_MODE_CONTINUOUS_PICTURE。PASSIVE_FOCUSED 的工作方式很奇怪。如果我把手机放在桌子上,摄像头朝向桌子,它就会停止获取状态;如果我把手机举起来,它就会一直发送信息,似乎无法检测到我已经对焦。而且我不能使用 FOCUSED_LOCKED,因为我希望预览不会锁定,使预览保持流畅。更新 实际上,我发现 CONTROL_AF_TRIGGER_START 似乎可以做到我想要的,非常感谢您确认我走在正确的道路上 :) - Hiam
有些情况下,它永远无法找到焦点。例如,如果场景比设备的MINIMUM_FOCUS_DISTANCE更近。此外,设备使用的实际AF例程取决于您无法控制的因素,即硬件。您唯一可以保证的是状态机将遵循我引用的链接,其中确实说了一些模棱两可的话,比如“设备可能会启动另一个扫描”。这是我们能得到的最好的结果。 - rcsumner
也许您知道如何解决我的问题,当相机对焦时我该如何拍照?这是我的问题链接:http://stackoverflow.com/questions/40185407/how-to-take-picture-only-if-image-in-focus-camera-2-api。提前致谢! - Sirop4ik
这里有一个很好的资源,可以了解对焦状态以及键代表的含义。 - Clocker

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