【问题标题】:How to trigger manual autofocus in camera2 API?如何在 camera2 API 中触发手动自动对焦?
【发布时间】:2026-02-12 13:30:01
【问题描述】:

已弃用的相机 API 为相机对象提供了函数autofocus(),我们可以在检测到我们获得的帧/图像模糊后增加预览/捕获的焦点。

现在我们更新了我们的应用程序以使用 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

【问题讨论】:

    标签: java android android-camera android-camera2


    【解决方案1】:

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

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

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

    【讨论】: