Подтвердить что ты не робот

Android-камера AutoFocus по запросу

Встроенное приложение Camcorder (как и на 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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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/

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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