在拍照之前如何检查相机是否聚焦于某物?

时间:2018-04-10 10:16:22

标签: android android-camera autofocus

在我的相机应用程序中,我将相机对焦模式设置为FOCUS_MODE_AUTO,我也通过触摸实现了对焦。当用户按下捕获按钮时,我需要检查相机是否已经聚焦在某物上(通过触摸)或者在拍照之前不要调用Camera.autoFocus()。我怎么能这样做?

if (/* how to check ??? */) {
    mCamera.autoFocus(new Camera.AutoFocusCallback() {
        @Override
        public void onAutoFocus(boolean success, Camera camera) {
        mCamera().takePicture(null, null, jpegCallback);
        }
    });
}
else {
    mCamera().takePicture(null, null, jpegCallback);
}

2 个答案:

答案 0 :(得分:0)

试试这个:

mCamera.autoFocus(new Camera.AutoFocusCallback() {
    @Override
    public void onAutoFocus(boolean success, Camera camera) {
       if(success) {
           mCamera().takePicture(null, null, jpegCallback);
       } else {
            //NOT YET FOCUSED
       }
    }
});

修改

boolean isManualFocused = false;
mCameraPreview.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        isManualFocused = true;
        return false;
    }
});
if (!isManualFocused) {
  mCamera.autoFocus(new Camera.AutoFocusCallback() {
     @Override
     public void onAutoFocus(boolean success, Camera camera) {
       mCamera().takePicture(null, null, jpegCallback);
     }
  });
}
else {
  mCamera().takePicture(null, null, jpegCallback);
}

EDIT2:

您可以收听NOT_FOCUSED_LOCKED等事件来检测案例(请参阅所有事件:https://developer.android.com/reference/android/hardware/camera2/CaptureResult.html

示例代码:

私人CameraCaptureSession.CaptureCallback mCaptureCallback         = new CameraCaptureSession.CaptureCallback(){

private void process(CaptureResult result) {
    switch (mState) {
        case STATE_PREVIEW: {
             int state = result.get(CaptureResult.NOT_FOCUSED_LOCKED);
        }
    }
}

答案 1 :(得分:0)

如果你正在使用FOCUS_MODE_AUTO,你基本上必须在每张图片之前触发AF;在该模式下,除非您正在主动运行自动对焦,否则镜头不会移动,并且自动对焦系统不会在自动对焦()调用之外监控对焦质量。

如果您使用FOCUS_MODE_CONTINUOUS_PICTURE,那么AF系统将始终尝试保持AF聚焦。您可以使用AutoFocusMove回调来监控焦点扫描何时开始和停止;遗憾的是,当焦点扫描停止时,无法保证场景处于焦点。

扫描也可以停止,因为设备放弃了,无法对当前场景进行聚焦。例如,如果场景距离相机太近而无法聚焦,或者光线不足,则可能发生这种情况。

不幸的是,旧的相机API没有更好的东西。