Android-камера автофокус по требованию - PullRequest
30 голосов
/ 04 мая 2011

Встроенное приложение для видеокамеры (как в HTC EVO), похоже, вызывает camera.autoFocus() только при изменении предварительного изображения. Если держать камеру неподвижно, camera.autoFocus() не произойдет.
Я хотел бы продублировать это поведение, пока camera.startPreview() активно, как в исходном коде настройки предварительного просмотра ниже:

camera = camera.open();
Camera.Parameters parameters = camera.getParameters();
List<String> focusModes = parameters.getSupportedFocusModes();
if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO))
{
    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
}
camera.setParameters(parameters);
camera.setPreviewDisplay(holder);
camera.startPreview();

Все примеры, которые я нашел для autoFocus(), кажутся вызывающими его каждые 500 мс - 2000 мс, или один раз за мгновение до того, как делается снимок или начинается запись.
Приложение EVO Camcorder, похоже, использует датчик или алгоритм для запуска autoFocus(). Однако этот autoFocus() триггер сделан, он работает исключительно хорошо. Кто-нибудь знает, как вызвать autoFocus() по требованию, когда это необходимо, например, когда камера перемещается близко или дальше от объекта или слегка панорамируется? Спасибо, Gerry

Ответы [ 5 ]

23 голосов
/ 03 апреля 2012

Android представила непрерывный автофокус со времени API Level 9 (Gingerbread). Это работает лучше, чем периодический вызов Camera.autoFocus.

19 голосов
/ 11 мая 2012

У меня была такая же проблема в одном из моих приложений.

Мое решение состояло в том, чтобы использовать сенсорный приемник и делать автофокус, когда пользователь встряхнул устройство до некоторого порога.Вот код.

public void setCameraFocus(AutoFocusCallback autoFocus){
if (mCamera.getParameters().getFocusMode().equals(mCamera.getParameters().FOCUS_MODE_AUTO) ||
        mCamera.getParameters().getFocusMode().equals(mCamera.getParameters().FOCUS_MODE_MACRO)){
    mCamera.autoFocus(autoFocus);
}

}

Обратный вызов для автоматической фокусировки:

// this is the autofocus call back
private AutoFocusCallback myAutoFocusCallback = new AutoFocusCallback(){

    public void onAutoFocus(boolean autoFocusSuccess, Camera arg1) {
        //Wait.oneSec();
        mAutoFocus = true;
    }};

И способ вызова фокуса.

public void onSensorChanged(SensorEvent event) {

if (mInvalidate == true){
    mView.invalidate();
    mInvalidate = false;
}
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
if (!mInitialized){
    mLastX = x;
    mLastY = y;
    mLastZ = z;
    mInitialized = true;
}
float deltaX  = Math.abs(mLastX - x);
float deltaY = Math.abs(mLastY - y);
float deltaZ = Math.abs(mLastZ - z);

if (deltaX > .5 && mAutoFocus){ //AUTOFOCUS (while it is not autofocusing)
    mAutoFocus = false;
    mPreview.setCameraFocus(myAutoFocusCallback);
}
if (deltaY > .5 && mAutoFocus){ //AUTOFOCUS (while it is not autofocusing)
    mAutoFocus = false;
    mPreview.setCameraFocus(myAutoFocusCallback);
}
if (deltaZ > .5 && mAutoFocus){ //AUTOFOCUS (while it is not autofocusing) */
    mAutoFocus = false;
    mPreview.setCameraFocus(myAutoFocusCallback);
}

mLastX = x;
mLastY = y;
mLastZ = z;

}

Вы можете увидеть полный проект здесь: http://adblogcat.com/a-camera-preview-with-a-bounding-box-like-google-goggles/

2 голосов
/ 30 июля 2012

Для фотосъемки вы можете установить это .

Приложения могут вызывать autoFocus(AutoFocusCallback) в этом режиме. Если автофокус находится в середине сканирования, обратный вызов фокуса вернется после его завершения. Если автофокус не сканирует, обратный вызов фокуса немедленно возвращается с логическим значением, которое указывает, является ли фокус резким или нет. Затем приложения могут решить, хотят ли они сделать снимок немедленно или изменить режим фокусировки на автоматический, и запустить полный цикл автофокусировки.

2 голосов
/ 15 мая 2012

Очень легко вызвать перефокусировку с более простой техникой, если у вас есть вспышка белого ящика в поле зрения камеры (из кода, а не из реального окна), она быстро вызовет перефокусировку.У меня есть EVO 4G, и один из предыдущих постеров верен, он постоянно перефокусируется без необходимости менять то, на что он смотрит, с момента обновления до Gingerbread.

0 голосов
/ 25 марта 2012

Я бы использовал SensorEventListener.Все, что вам нужно сделать, это прослушать сенсорные события и активировать автофокус, как только ориентация телефона изменится с достаточным порогом.

http://developer.android.com/reference/android/hardware/SensorEventListener.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...