android - ser - samsung drive
Android Camera AutoFocus on Demand (5)
Android ha introducido el enfoque automático continuo desde el nivel 9 de API (Gingerbread). Funciona mejor que llamar a Camera.autoFocus periódicamente.
La aplicación integrada de la videocámara (como la del HTC EVO) parece llamar a camera.autoFocus()
solo cuando la imagen de vista previa cambia. Si mantiene la cámara firme, no se camera.autoFocus()
.
Me gustaría duplicar este comportamiento mientras camera.startPreview()
está activo como en el código de configuración de vista previa a continuación:
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();
Todos los ejemplos que encontré para autoFocus () parecen llamarlo cada 500 ms a 2000 ms, o una vez el instante antes de que se tome la fotografía o se inicie la grabación.
La aplicación de la videocámara EVO parece usar un sensor o un algoritmo para activar autoFocus()
. Sin embargo, este autoFocus()
está hecho, funciona excepcionalmente bien. ¿Alguien tiene algún conocimiento de cómo activar autoFocus()
a pedido cuando sea necesario? ¿Esto es cuando la cámara se acerca o se aleja del sujeto o la cámara se mueve ligeramente? Gracias gerry
Es muy posible llamar a un reenfoque con una técnica más simple, si tiene un flash de recuadro blanco dentro de la vista de las cámaras (desde el código, no desde un recuadro real) llamará rápidamente un reenfoque. Soy el propietario de la EVO 4G y uno de los pósters anteriores es correcto, se vuelve a enfocar continuamente sin la necesidad de cambiar lo que está viendo desde la actualización de Gingerbread.
Para tomar fotos, puede configurar this .
Las aplicaciones pueden llamar a
autoFocus(AutoFocusCallback)
en este modo. Si el enfoque automático está en medio de la exploración, la devolución de llamada de enfoque volverá cuando se complete. Si el enfoque automático no está escaneando, la devolución de llamada de enfoque regresará inmediatamente con un booleano que indica si el enfoque es nítido o no. Las aplicaciones pueden decidir si quieren tomar una foto inmediatamente o cambiar el modo de enfoque a automático y ejecutar un ciclo de enfoque automático completo.
Tuve el mismo problema en una de mis aplicaciones.
Mi solución fue utilizar un detector de sensores y realizar un enfoque automático cuando el usuario sacudió el dispositivo hasta un cierto umbral. Aquí está el código.
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);
}
}
La devolución de llamada para el enfoque automático:
// this is the autofocus call back
private AutoFocusCallback myAutoFocusCallback = new AutoFocusCallback(){
public void onAutoFocus(boolean autoFocusSuccess, Camera arg1) {
//Wait.oneSec();
mAutoFocus = true;
}};
Y la forma de llamar al foco.
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;
}
Puede ver el proyecto completo aquí: http://adblogcat.com/a-camera-preview-with-a-bounding-box-like-google-goggles/
Yo haría uso del SensorEventListener. Todo lo que tendría que hacer es escuchar los eventos del sensor y disparar el enfoque automático una vez que la orientación de los teléfonos haya cambiado en un umbral suficiente.
http://developer.android.com/reference/android/hardware/SensorEventListener.html