Как включить ручной автофокус в API Camera2? - PullRequest
0 голосов
/ 28 ноября 2018

Устаревший API-интерфейс камеры предложил объекту Camera функцию autofocus(), с помощью которой мы могли бы увеличить фокус предварительного просмотра / захвата после обнаружения того, что полученные кадры / изображения размыты.

Теперь мы обновилинаше приложение использует API-интерфейс camera2 и все еще пытается выяснить, как мы можем вручную активировать автофокусировку камеры.Для инициализации предварительного просмотра мы используем следующий код:

// 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();
    }
};


Обновление: Следующий ответ также помог мне реализовать решение этой проблемы: ссылка

1 Ответ

0 голосов
/ 01 декабря 2018

Установите для поля запроса захвата CONTROL_AF_TRIGGER значение START для одного запроса на запуск действия автофокуса.

Что это за действие зависит от режима автофокуса;для режима непрерывного изображения AF обычно блокируется, если он считает, что уже находится в фокусе.Если AF не сходится, он попытается быстро сходиться и затем заблокирует AF.Блокировка сохраняется до тех пор, пока AF_TRIGGER не будет установлен на CANCEL для одного запроса (или режим AF не будет изменен).

Поэтому, если вы хотите запустить полную развертку АФ, вы можете переключиться на AF_MODE_AUTO и затем запустить, так как запуск с непрерывной фокусировкой не обязательно повторно сканирует сцену.

...