如何在 camera2 API 中触发手动自动对焦?

How to trigger manual autofocus in camera2 API?

已弃用的相机 API 为 Camera 对象提供了函数 autofocus(),我们可以在检测到 frames/images 后增加 preview/capture 的焦点很模糊。

现在我们更新了我们的应用程序以使用 camera2 API 并且仍在尝试弄清楚我们如何手动触发相机自动对焦。对于预览的初始化,我们使用以下代码:

// When the session is ready, we start displaying the preview.
mCaptureSession = cameraCaptureSession;
try {
    // Auto focus should be continuous for camera preview.
    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
            CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
    // Flash is automatically enabled when necessary.
    setAutoFlash(mPreviewRequestBuilder);

    // Finally, we start displaying the camera preview.
    mPreviewRequest = mPreviewRequestBuilder.build();
    mCaptureSession.setRepeatingRequest(mPreviewRequest,
            mCaptureCallback, mBackgroundHandler);
} catch (CameraAccessException e) {
    e.printStackTrace();
}

稍后在分析图像质量时访问捕获帧时,如果它太模糊,我们想再次触发自动对焦以提高结果质量:

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener
        = new ImageReader.OnImageAvailableListener() {

    @Override
    public void onImageAvailable(ImageReader reader) {
        Log.e(TAG, "Image captured!");
        Image image = reader.acquireLatestImage();
        float focusScore = analyseImage(image);
        if(focusScore < 10) {
          // Here we would like to trigger some focus functionality
        } else {
          // Take the result frame as good enough and proceed
        }

        image.close();
    }
};


更新: 下面的回答也帮助我实现了这个问题的解决方案:link

CONTROL_AF_TRIGGER 捕获请求字段设置为 START 以触发自动对焦操作的一个请求。

该动作取决于自动对焦模式;对于连拍模式,如果认为已经对焦,AF 通常会被锁定。如果 AF 没有收敛,它会尝试快速收敛然后锁定 AF。锁定一直持续到 AF_TRIGGER 被设置为 CANCEL 对于一个请求(或 AF 模式被更改)。

因此,如果您想触发完整的 AF 扫描,您可能需要切换到 AF_MODE_AUTO 然后再触发,因为连续对焦触发不一定会重新扫描场景。