Ручная фокусировка с использованием Android camera2 API

Я хочу разработать для себя приложение Android Camera (могу поделиться, если есть желающие), которое имеет ручную фокусировку во время записи видео.

Я добавил SeekBar в пример Google приложения Camera2, но не могу найти способ реализовать ручную фокусировку.

Я нашел Ручную фокусировку в камере2, Android, но она не работает на моем LG G4 . Стандартное приложение камеры почти идеально, поскольку оно не позволяет выполнять ручную фокусировку в режиме видео.

У кого-нибудь из вас есть идея?

РЕДАКТИРОВАТЬ: вот код прослушивателя SeekBar:

@Override
public void onStopTrackingTouch(SeekBar seekBar) {}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
    mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_OFF);
}

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    float minimumLens = characteristics.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE);
    float num = (((float)progress) * minimumLens / 100);
    mPreviewBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, num);
}

person Raphaël    schedule 20.03.2017    source источник


Ответы (2)


Вам нужно проверить, действительно ли устройство, на котором вы работаете, поддерживает ручное управление в camera2.

Ключевым моментом является то, соответствуют ли доступным возможностям устройства камеры. перечисляет MANUAL_SENSOR. Если да, то вы можете управлять объективом, установив режим автофокуса в положение OFF, а затем установите дистанцию ​​фокусировки объектива до желаемого значения. Если MANUAL_SENSOR отсутствует в списке, то устройство, скорее всего, не поддерживает ручное управление фокусировкой (к сожалению, некоторые производители используют частные интерфейсы для приложения камеры по умолчанию для реализации ручного управления фокусировкой).

Все они должны войти в повторяющийся запрос, который вы используете для управления предварительным просмотром.

person Eddy Talvala    schedule 20.03.2017
comment
Существует APK (play.google.com/store/apps /), чтобы узнать, поддерживает ли устройство Camera2 API, а LG G4 имеет полную поддержку и указано MANUAL_SENSOR. Я попытался отключить режим автофокуса, но когда я установил фокусное расстояние объектива на значение SeekBar, ничего не происходит. Я отредактировал свой основной пост, чтобы добавить код, который у меня есть. - person Raphaël; 21.03.2017
comment
Где вы вызываете mSession.setRepeatingRequest(mPreviewBuilder.build()) после обновления значений построителя предварительного просмотра? - person Eddy Talvala; 21.03.2017
comment
Я на самом деле не называю это, но это работает, когда я пытался в onProgressChanged(), большое спасибо! - person Raphaël; 22.03.2017
comment
Да, вызов Builder.set просто обновляет одно поле в вашем запросе. Вам все равно нужно отправить его на камеру, чтобы что-то изменить, либо с помощью функции capture() (для захвата одного изображения с этими настройками), либо с помощью setRepeatingRequest (для непрерывного захвата). - person Eddy Talvala; 22.03.2017

Эдди Талвала все правильно описал в своем ответе, но если вы все еще чувствуете себя сложно, вот фрагмент кода, который устанавливает фокус на бесконечность (имеет значение 0f):

CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
int[] capabilities = characteristics
    .get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);

boolean isManualFocusSupported = IntStream.of(capabilities)
    .anyMatch(x -> x == CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR);

if (isManualFocusSupported) {
    previewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF);
    previewBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, 0f);
}
person Alexander Ponomarev    schedule 08.08.2017
comment
Это работает, подскажите, пожалуйста, код для захвата изображения с ручной дистанцией фокусировки. - person Shanki Bansal; 20.07.2018
comment
к сожалению, это не работает, пока камера работает :/ - person Fattie; 12.03.2021