Как принудительно установить фокусное расстояние с помощью camera2 API? - PullRequest
0 голосов
/ 17 мая 2019

Я создал приложение для компьютерного зрения для Android. Я использую фронтальную камеру для захвата изображений, на которых я применяю свои алгоритмы. На моем Samsung 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);
}
...