2017-02-09 12 views
6

Я пытаюсь заблокировать фокус после того, как пользовательская камера находит фокус. Сначала режим автофокусировки установлен в автоматический режим:Как заблокировать фокус в camera2 api, android?

builder.set(CaptureRequest.CONTROL_AF_MODE, 
        CaptureRequest.CONTROL_AF_MODE_AUTO); 

И Коснувшись просмотра он находит фокусное расстояние, и я должен зафиксировать AF и AE с помощью этого кода:

builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); 
builder.set(CaptureRequest.CONTROL_AE_LOCK, true); 

Блокировка AE работает нормально в любые устройства. Блокировка автофокусировки работает на Nexus5 и Nexus 5x. Но что касается Samsung S5 и S6, он пытается найти фокус.

Каков наилучший способ блокировки фокуса?

ответ

9

Для того, чтобы заблокировать AF вы должны заботиться о запросе AF_TRIGGER только один раз с помощью capture() вместо repeatingRequest() (если не он попадает в петлю запроса аф и остается всегда пытаясь сосредоточиться, но некоторые нексус исправить это в FW, поэтому некоторые устройства, как Nexus 5 внимание также даже она не должна)

таким образом, правильный порядок будет:

  • CONTROL_AF_MODE Набор для CONTROL_AF_MODE_AUTO (с помощью session.setRepeatingRequest()) и AF_REGIONS и AE_REGIONS если вы хотите

  • Подождите, пока вы не убедитесь, что CONTROL_AF_MODE уже в авто, проверив totalCaptureRequest от CaptureCallback.

  • Установите AF_TRIGGER_START в строитель вместе с CONTROL_AF_MODE_AUTO, но на этот раз вместо того, чтобы использовать session.setRepeatingRequest() использовать session.capture().

  • Inmediately после этого установите AF_TRIGGER установить AF_TRIGGER_IDLE (не отменить!) В использовании снова session.setRepeatingRequest() along with the CONTROL_AF_MODE_AUTO`.

  • Подождите, пока он не сфокусирован, вы получите FOCUSED_LOCKED или NOT_FOCUSED_LOCKED.

PASSIVE_FOCUSED состояние только тогда, когда CONTROL_AF_MODE находится в непрерывной картины не в авто!

Перед выполнением спускового крючка позаботьтесь о том, чтобы быть в режиме автоматической фокусировки.

Вы должны всегда использовать session.capture() со всех триггеров (с CONTROL_AE_PRECAPTURE_TRIGGER тоже), но всегда после этого не забудьте поставить триггеры IDLE (не отменить) в session.repeatingRequest()

+0

Очень удивительное объяснение! Спасибо. – imudin07

+0

Было бы здорово, если бы вы взглянули на этот вопрос http://stackoverflow.com/questions/42090124/searching-focus-keeps-failing-with-external-lens-camera2-api-in-android – imudin07

+0

Mmm, извините, я не работал с каким-либо внешним объективом, я не могу вам помочь :( – Yamidragut

2

Вы не можете сосредоточиться на фокусе на CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE.

Вы должны включить режим автофокусировки на CONTROL_AF_MODE_AUTO и дождаться состояния FOCUSED_LOCKED во время запуска автофокуса. Вы можете проверить, как фокус машина Android работает на enter link description here

+0

Да, я также делаю то же самое. Сначала это 'CONTROL_AF_MODE_AUTO', и дождитесь, пока состояние AF будет' FOCUSED_LOCKED' или 'PASSIVE_FOCUSED'.И затем я установил триггер автофокусировки в режим CONTROL_AF_TRIGGER_CANCEL, AF для параметра CONTROL_AF_MODE_CONTINUOUS_PICTURE для Nexus, CONTROL_AF_MODE_OFF, для Samsung s5/s6 – imudin07

+0

Но я не уверен, что это правильный способ, потому что он действует на устройстве на другом устройстве. – imudin07

+0

Если я настроюсь на 'CONTROL_AF_MODE_OFF', он отлично работает для Samsung. Но в Nexus5/5x он становится размытым. – imudin07