Какой минимальный CaptureRequest требуется для создания предварительного просмотра с фиксированным фокусным расстоянием

С фрагментом кода ниже не удается создать CaptureRequest для предварительного просмотра с фиксированным фокусным расстоянием. Изображение, отображаемое в предварительном просмотре, всегда фокусируется на бесконечности, даже если в отчете из TotalCaptureRequest указано иное.

Вот фрагмент кода:

mPreviewBuilder = mCameraDevice.createCaptureRequest(SCameraDevice.TEMPLATE_PREVIEW);
mPreviewBuilder.set(SCaptureRequest.LENS_FOCUS_DISTANCE, 9.5f);
mPreviewBuilder.set(SCaptureRequest.CONTROL_AF_MODE, SCaptureRequest.CONTROL_AF_MODE_OFF);

Моим устройством является Samsung Galaxy S7, который сообщает следующие свойства для задней камеры: [код]CamId: 0 LensFace: BACK HwdSupportLevel: FULL SensorOrientation: 90 LensCalibration: CALIBRATED LensMinFocusDist: 10.0[/code]

Вот мой журнал, захваченный во время onCaptureComplete()

 callback: AF_STATE: 0 Lens Focus Distance: 9.555555 LENS_STATE: 0 HAS FOCUS RANGE: true Focus Range Min: 9.762765, Max: 9.348346

Я пробовал это с помощью старого API Android Camera2, а также с Samsung SDK (находится здесь: http://developer.samsung.com/galaxy/camera)

Собственное приложение Samsung для камеры, а также Camera FV-5 поддерживают эту функцию без каких-либо проблем.

Как мне заставить это работать?

Добавление еще кода для контекста

/**
 * Start the camera preview.
 */
private void startPreview() {
    if (null == mCameraDevice || !mTextureView.isAvailable() || null == mPreviewSize) {
        return;
    }
    try {
        closePreviewSession();
        SurfaceTexture texture = mTextureView.getSurfaceTexture();
        assert texture != null;
        texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
        mPreviewBuilder = mCameraDevice.createCaptureRequest(SCameraDevice.TEMPLATE_PREVIEW);
        //mPreviewBuilder.set(SCaptureRequest.CONTROL_CAPTURE_INTENT, SCaptureRequest.CONTROL_CAPTURE_INTENT_MANUAL);
        //mPreviewBuilder.set(SCaptureRequest.CONTROL_MODE, SCaptureRequest.CONTROL_MODE_OFF);
        mPreviewBuilder.set(SCaptureRequest.CONTROL_AF_MODE, SCaptureRequest.CONTROL_AF_MODE_OFF);
        mPreviewBuilder.set(SCaptureRequest.CONTROL_AE_MODE, SCaptureRequest.CONTROL_AE_MODE_ON);
        mPreviewBuilder.set(SCaptureRequest.LENS_FOCUS_DISTANCE, 9.5f);

        Surface previewSurface = new Surface(texture);
        mPreviewBuilder.addTarget(previewSurface);

        mCameraDevice.createCaptureSession(Arrays.asList(previewSurface), new SCameraCaptureSession.StateCallback() {

            @Override
            public void onConfigured(SCameraCaptureSession cameraCaptureSession) {
                mPreviewSession = cameraCaptureSession;
                updatePreview();
            }

            @Override
            public void onConfigureFailed(SCameraCaptureSession cameraCaptureSession) {
                Toast.makeText(getApplicationContext(),"Failed", Toast.LENGTH_SHORT).show();
            }
        }, mBackgroundHandler);


    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}


/**
 * Update the camera preview. {@link #startPreview()} needs to be called in advance.
 */
private void updatePreview() {
    if (null == mCameraDevice) {
        return;
    }
    try {
        setUpCaptureRequestBuilder(mPreviewBuilder);
        HandlerThread thread = new HandlerThread("CameraPreview");
        thread.start();
        mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), mCaptureCallBack, mBackgroundHandler);
        Log.i(TAG, "New Session values, control mode " + mPreviewBuilder.get(SCaptureRequest.CONTROL_MODE) +
                ", AF mode: " + mPreviewBuilder.get(SCaptureRequest.CONTROL_AF_MODE) +
                ", Focus value; " + +mPreviewBuilder.get(SCaptureRequest.LENS_FOCUS_DISTANCE));
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

1 ответ

Вы добавили поверхность в ваш mPreviewBuilder?

 Surface surface = new Surface(texture);
 //Add surfaces
 mPreviewBuilder.addTarget(surface);
 surfaces.add(surface);

Во-вторых, отключите AF_MODE перед установкой LENS_FOCUS_DISTANCE и, наконец, обновите ваш сеанс с помощью setRepeatingRequest поверх CaptureSesion. С этим должно работать.

 mCaptureSession.setRepeatingRequest(mPreviewBuilder.build(),
                callback, mHandler);

Проверьте значения вашего CaptureRequest с журналом, чтобы убедиться, что все правильно, и вы не перекрываете что-то с вашим AF:

 Log.i(TAG, "New Session values, control mode " + mPreviewRequestBuilder.get(CaptureRequest.CONTROL_MODE) +
            ", AF mode: " + mPreviewRequestBuilder.get(CaptureRequest.CONTROL_AF_MODE) +
            ", Focus value; " + +mPreviewRequestBuilder.get(CaptureRequest.LENS_FOCUS_DISTANCE));
Другие вопросы по тегам