web-dev-qa-db-fra.com

Android Camera2 augmenter la luminosité

J'utilise Android camera2 dans mon application pour prendre des images en continu. Ici, lorsque j'utilise camera2, la luminosité de l'aperçu de l'image est très sombre par rapport à la caméra d'origine. J'ai vu this mais il n'y a pas d'exigence similaire dans cette réponse.

J'ai essayé de régler la luminosité dans camera2 comme suggéré ici :

Notez que ce contrôle ne sera effectif que si Android.control.aeMode! = OFF. Ce contrôle prendra effet même si Android.control.aeLock == true.

captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
            captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
            captureRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true);
            captureRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 6);

Mais il continue d'afficher l'aperçu sous forme d'image sombre uniquement, comme illustré ci-dessous.

Voyez la différence ici:

Appareil photo d'origine: enter image description here

Utilisation de Camera2: enter image description here

Et quelle est la valeur que je dois passer comme second paramètre dans:

captureRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 6);

J'ai gardé 6 parce que, comme suggéré dans la doc:

Par exemple, si l'étape de valeur d'exposition (EV) est de 0,333, "6" signifie une compensation d'exposition de +2 EV; -3 signifiera une compensation d'exposition de -1 EV.

Mais toujours pas d'effet de luminosité ..

13
Shylendra Madda

C'est ici:

Ajouter le code ci-dessous dansonConfigured() et unlockFocus()

captureRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,getRange());

En utilisant le code ci-dessus, vous obtiendrez un meilleur aperçu. Mais votre image capturée restera telle quelle. Pour obtenir une meilleure image, utilisez le même code que ci-dessous danscaptureStillPicture() 

captureBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, getRange());

getRange is:

    private Range<Integer> getRange() {
    CameraCharacteristics chars = null;
    try {
        chars = mCameraManager.getCameraCharacteristics(mCameraId);
        Range<Integer>[] ranges = chars.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
        Range<Integer> result = null;
        for (Range<Integer> range : ranges) {
            int upper = range.getUpper();
            // 10 - min range upper for my needs
            if (upper >= 10) {
                if (result == null || upper < result.getUpper().intValue()) {
                    result = range;
                }
            }
        }
        if (result == null) {
            result = ranges[0];
        }
        return result;
    } catch (CameraAccessException e) {
        e.printStackTrace();
        return null;
    }
}
4
Ronak Thakkar

Tu peux essayer ça

public void setBrightness(int value) {
    int brightness = (int) (minCompensationRange + (maxCompensationRange - minCompensationRange) * (value / 100f));
    previewRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, brightness);
    applySettings();
 }

private void applySettings() {
    captureSession.setRepeatingRequest(previewRequestBuilder.build(), null, null);
}
1
Jayesh

CONTROL_AE_LOCK devrait être désactivé. Vous avez mal interprété le document, éventuellement le document lui-même est un peu déroutant. 

Notez que ce contrôle ne sera efficace que si Android.control.aeMode! = OFF. Ce contrôle prendra effet même lorsque Android.control.aeLock == true.

Cela signifie que lorsque la mémorisation d'exposition est activée, la correction d'exposition sera appliquée à l'exposition mémorisée et non à l'exposition instantanée au moment de la prise de vue. 

Même dans votre demande de répétition, l'exposition est verrouillée afin que cela ne vous aide pas.

Retirez le verrouillage AE et cela devrait fonctionner. 

1
yumoji

Lors de la définition de CONTROL_AE_EXPOSURE_COMPENSATION, le second paramètre défini par docs est relatif à CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP.

L'ajustement est mesuré en tant que nombre d'étapes, avec la taille d'étape définie par Android.control.aeCompensationStep et la plage autorisée par Android.control.aeCompensationRange. "

La valeur 6 dans l'exemple pour + 2EV n'est correcte que lorsque step est 0.333, ce qui n'est qu'un exemple.

Le code suivant vous donnera la valeur de compensation d'exposition à utiliser pour + 2EV

CameraManager manager = (CameraManager)this.getSystemService(Context.CAMERA_SERVICE);
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
double exposureCompensationSteps = characteristics.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP).doubleValue();
int exposureCompensation = (int)( 2.0 / exposureCompensationSteps );

Je vous suggère également de vérifier si la valeur est dans la plage spécifiée par CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE

0
Bhoju

Tout d'abord, ne verrouillez pas l'exposition automatique - cela n'est pas nécessaire lors du réglage de la compensation d'exposition.

Deuxièmement, avez-vous appelé CameraCaptureSession.setRepeatingRequest avec votre nouvelle demande de capture?

0
Eddy Talvala