web-dev-qa-db-fra.com

Android Mise au point automatique de l'appareil photo à la demande

L'application Camcorder intégrée (comme celle du HTC EVO) semble appeler camera.autoFocus() uniquement lorsque l'image d'aperçu change. Si vous tenez fermement l'appareil photo, aucune camera.autoFocus() ne se produit.
Je voudrais dupliquer ce comportement pendant que camera.startPreview() est actif comme dans le code de configuration d'aperçu initial ci-dessous:

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();

Tous les exemples que j'ai trouvés pour autoFocus() semblent l'appeler tous les 500 ms à 2000 ms, ou une fois l'instant précédant la prise de vue ou le démarrage de l'enregistrement.
L'application EVO Camcorder semble utiliser un capteur ou un algorithme pour déclencher autoFocus(). Cependant, ce déclencheur autoFocus() est fait, il fonctionne exceptionnellement bien. Quelqu'un sait-il comment déclencher autoFocus() à la demande lorsque cela est nécessaire, par exemple lorsque l'appareil photo est rapproché ou éloigné du sujet ou est légèrement panoramique? Merci, Gerry

30
GerryL

Android a introduit mise au point automatique continue depuis le niveau d'API 9 (Gingerbread). Cela fonctionne mieux que d'appeler périodiquement Camera.autoFocus.

23
arsalank2

J'ai eu le même problème dans l'une de mes applications.

Ma solution était d'utiliser un écouteur de capteur et de faire la mise au point automatique lorsque l'utilisateur secouait l'appareil à un certain seuil. Voici le code.

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);
}

}

Le rappel pour la mise au point automatique:

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

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

Et la façon d'appeler le focus.

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;

}

Vous pouvez voir le projet complet ici: http://adblogcat.com/a-camera-preview-with-a-bounding-box-like-google-goggles/

19
Juan Acevedo

Pour prendre des photos, vous pouvez définir this .

Les applications peuvent appeler autoFocus(AutoFocusCallback) dans ce mode. Si la mise au point automatique est en cours de numérisation, le rappel de mise au point revient à la fin. Si la mise au point automatique n'est pas en cours de numérisation, le rappel de mise au point revient immédiatement avec un booléen qui indique si la mise au point est nette ou non. Les applications peuvent ensuite décider si elles veulent prendre une photo immédiatement ou changer le mode de mise au point sur auto, et exécuter un cycle de mise au point automatique complet.

2
Santosh

Il est très possible d'appeler un recentrage avec une technique plus simple, si vous avez un flash à boîte blanche dans la vue des caméras (à partir du code, pas une vraie boîte), il appellera rapidement un recentrage. Je possède l'EVO 4G et l'une des affiches précédentes est correcte, elle se recentre continuellement sans avoir besoin de changer ce qu'elle regarde depuis la mise à jour de Gingerbread.

2
Speedytech7