如何使用camera2 API强制焦距为固定值?

How to force the focal length to a fixed value with camera2 API?

我为 Android 创建了一个计算机视觉应用程序。我使用前置摄像头捕捉应用算法的图像。在我的三星 Galaxy S8 上,我观察到当我将物体放在相机前面时,焦距会随着自动对焦而变化(它会不断放大和缩小)。这是一个问题,因为它会在图像中产生不必要的变化,这些变化会影响我的算法。如何确定一个合理的焦距值,然后在不禁用自动对焦的情况下强制传感器保持固定?

这是我设置相机采集的代码。

private void createCameraPreviewSession() throws CameraAccessException {
    mCameraDevice.createCaptureSession(Arrays.asList(mImageReader.getSurface()),
            new CameraCaptureSession.StateCallback() {
                @Override
                public void onConfigured(CameraCaptureSession cameraCaptureSession) {
                    if (null == mCameraDevice) {
                        return;
                    }
                    mCaptureSession = cameraCaptureSession;
                    try {
                        mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
                                CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
                        mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
                                CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);

                        mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(), null, mBackgroundHandler);
                    } catch (Exception e) {
                        Log.e(Config.tag, "createCaptureSession failed", e);
                    }
                }

                @Override
                public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
                    Log.e(Config.tag, "createCameraPreviewSession failed");
                }
            },
            null
    );
}

private void createImageReader() throws CameraAccessException
{
    mImageReader = ImageReader.newInstance(mFrameSize.getWidth(), mFrameSize.getHeight(),
            mPreviewFormat, 2);
    mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
        @Override
        public void onImageAvailable(ImageReader reader) {
            if (mCaptureSession == null) {
                return;
            }
            Image image = reader.acquireLatestImage();
            if (image == null) {
                return;
            }

            //do something with the image

            image.close();
        }
    }, mBackgroundHandler);
    Surface surface = mImageReader.getSurface();

    mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
    mPreviewRequestBuilder.addTarget(surface);
}

我认为使用 CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE 是试图持续保持图像对焦的模式。就我而言,在一些具有多个前置镜头的高端设备上,这可能会导致镜头之间的切换。我刚刚将自动对焦模式更改为 CaptureRequest.CONTROL_AF_MODE_AUTO 并且自动对焦停止不断改变焦点。另外,我使用CaptureRequest.CONTROL_AE_LOCK选项在关键时刻锁定和解锁自动曝光,以避免不必要的曝光变化。