web-dev-qa-db-fra.com

Comment verrouiller la mise au point dans camera2 api, android?

J'essaie de verrouiller la mise au point après que mon appareil photo personnalisé a trouvé la mise au point. Tout d'abord, le mode AF réglé sur auto:

builder.set(CaptureRequest.CONTROL_AF_MODE,
                    CaptureRequest.CONTROL_AF_MODE_AUTO);

Et après avoir touché l'aperçu, il trouve la distance de mise au point, et je dois verrouiller AF et AE en utilisant ce code:

builder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
builder.set(CaptureRequest.CONTROL_AE_LOCK, true);

Le verrouillage AE fonctionne correctement sur tous les appareils. Locking AF fonctionne sur Nexus5 et Nexus 5x. Mais comme pour Samsung S5 et S6, il continue d'essayer de se concentrer.

Quelle est la meilleure façon de verrouiller la mise au point?

15
mudin

Afin de verrouiller l'AF, vous devez prendre soin de ne demander le AF_TRIGGER Qu'une seule fois en utilisant capture() au lieu de repeatingRequest() (sinon il entre dans une boucle de demande af et reste toujours à essayer de se concentrer, mais certains ne corrigent pas cela dans son FW, donc certains appareils comme Nexus 5 se concentrent bien même si cela ne devrait pas)

Ainsi, l'ordre correct sera:

  • Réglez CONTROL_AF_MODE Sur CONTROL_AF_MODE_AUTO (Via session.setRepeatingRequest()) et le AF_REGIONS Et le AE_REGIONS Si vous le souhaitez

  • Attendez de vérifier que le CONTROL_AF_MODE Est déjà en mode automatique en vérifiant le totalCaptureRequest du CaptureCallback.

  • Définissez le AF_TRIGGER_START Dans le générateur avec le CONTROL_AF_MODE_AUTO Mais cette fois au lieu d'utiliser session.setRepeatingRequest() utilisez session.capture().

  • Immédiatement après cela, définissez le AF_TRIGGER Pour définir le AF_TRIGGER_IDLE (Ne pas annuler!) Une réutilisation session.setRepeatingRequest() avec le CONTROL_AF_MODE_AUTO.

  • Attendez qu'il se soit concentré, vous recevrez FOCUSED_LOCKED Ou NOT_FOCUSED_LOCKED.

L'état PASSIVE_FOCUSED Est uniquement lorsque le CONTROL_AF_MODE Est en image continue et non en auto!

Prenez soin d'être vraiment en mode de mise au point automatique avant d'effectuer le déclenchement.

Vous devez toujours utiliser session.capture() avec tous les déclencheurs (avec CONTROL_AE_PRECAPTURE_TRIGGER Aussi) mais toujours après cela, n'oubliez pas de mettre les déclencheurs à IDLE (pas annuler) dans une fonction session.repeatingRequest()

22
Yamidragut

Vous ne pouvez pas vous concentrer sur CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE.

Vous devez mettre votre mode AF sur CONTROL_AF_MODE_AUTO et attendez FOCUSED_LOCKED état lors de votre déclenchement AF. Vous pouvez vérifier le fonctionnement de la machine de mise au point Android sur entrez la description du lien ici

4