Flux de sortie, recadrage et zoom

Flux de sortie

Le sous-système de caméra fonctionne uniquement sur le pipeline basé sur ANativeWindow pour toutes les résolutions et formats de sortie. Plusieurs flux peuvent être configurés en même temps pour envoyer une seule image à plusieurs cibles telles que le GPU, l'encodeur vidéo, RenderScript ou des tampons visibles par l'application (RAW Bayer, tampons YUV traités ou tampons codés JPEG).

À titre d'optimisation, ces flux de sortie doivent être configurés à l'avance et seul un nombre limité peut exister à la fois. Cela permet la pré-allocation des tampons de mémoire et la configuration du matériel de la caméra, de sorte que lorsque des demandes sont soumises avec des pipelines de sortie multiples ou variables répertoriés, il n'y aura pas de retards ou de latence dans l'exécution de la demande.

Pour plus d'informations sur les combinaisons de sortie de flux garanties qui dépendent du niveau matériel pris en charge, consultez createCaptureSession() .

Recadrage

Le recadrage de la matrice complète de pixels (pour le zoom numérique et d'autres cas d'utilisation où un champ de vision plus petit est souhaitable) est communiqué via le paramètre ANDROID_SCALER_CROP_REGION. Il s'agit d'un paramètre défini par demande et peut changer en fonction de la demande, ce qui est essentiel pour la mise en œuvre d'un zoom numérique fluide.

La région est définie comme un rectangle (x, y, largeur, hauteur), avec (x, y) décrivant le coin supérieur gauche du rectangle. Le rectangle est défini sur le système de coordonnées du tableau de pixels actif du capteur, (0,0) étant le pixel supérieur gauche du tableau de pixels actif. Par conséquent, la largeur et la hauteur ne peuvent pas être supérieures aux dimensions indiquées dans le champ d'informations statiques ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. La largeur et la hauteur minimales autorisées sont signalées par le HAL via le champ d'informations statique ANDROID_SCALER_MAX_DIGITAL_ZOOM, qui décrit le facteur de zoom maximum pris en charge. Par conséquent, la largeur et la hauteur minimales de la zone cultivée sont :

  {width, height} =
   { floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] /
       ANDROID_SCALER_MAX_DIGITAL_ZOOM),
     floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] /
       ANDROID_SCALER_MAX_DIGITAL_ZOOM) }

Si la région cultivée doit répondre à des exigences spécifiques (par exemple, elle doit commencer sur des coordonnées paires et sa largeur/hauteur doit être paire), le HAL doit effectuer les arrondis nécessaires et écrire la région cultivée finale utilisée dans la sortie. métadonnées du résultat. De même, si HAL implémente la stabilisation vidéo, il doit ajuster la région de recadrage résultante pour décrire la région réellement incluse dans la sortie après l'application de la stabilisation vidéo. En général, une application utilisant une caméra doit être capable de déterminer le champ de vision qu'elle reçoit en fonction de la zone recadrée, des dimensions du capteur d'image et de la distance focale de l'objectif.

Étant donné que la région cadrée s'applique à tous les flux, qui peuvent avoir des proportions différentes de celles de la région cadrée, la région exacte du capteur utilisée pour chaque flux peut être plus petite que la région cadrée. Plus précisément, chaque flux doit conserver ses pixels carrés et son rapport hauteur/largeur en recadrant au minimum la région de recadrage définie. Si le rapport hauteur/largeur du flux est plus large que la région recadrée, le flux doit être recadré davantage verticalement, et si le rapport hauteur/largeur du flux est plus étroit que la région recadrée, le flux doit être recadré davantage horizontalement.

Dans tous les cas, la culture du flux doit être centrée dans la zone de culture complète, et chaque flux n'est recadré que horizontalement ou verticalement par rapport à la zone de culture complète, jamais les deux.

Par exemple, si deux flux sont définis, un flux 640 x 480 (aspect 4:3) et un flux 1 280 x 720 (aspect 16:9), ci-dessous montre les régions de sortie attendues pour chaque flux pour quelques exemples de régions de culture, sur une base hypothétique de 3. Capteur MP (matrice de 2 000 x 1 500 pixels).

Zone cadrée : (500, 375, 1 000, 750) (rapport hauteur/largeur 4:3)
Recadrage de flux 640 x 480 : (500, 375, 1 000, 750) (égal à la région de recadrage)
Recadrage de flux 1280x720 : (500, 469, 1000, 562)

rapport de la région cultivée 43

Figure 1. Format d'image 4:3

Zone cadrée : (500, 375, 1 333, 750) (rapport hauteur/largeur 16:9)
Recadrage de flux 640 x 480 : (666, 375, 1 000, 750)
Recadrage de flux 1 280 x 720 : (500, 375, 1 333, 750) (égal à la région recadrée)

rapport de la région cultivée-169

Figure 2. Format d'image 16:9

Zone cadrée : (500, 375, 750, 750) (rapport hauteur/largeur 1:1)
Recadrage de flux 640 x 480 : (500, 469, 750, 562)
Recadrage de flux 1280 x 720 : (500, 543, 750, 414)

rapport de la région cultivée-11

Figure 3. Rapport hauteur/largeur 1:1

Et un dernier exemple, un flux au format carré de 1024x1024 au lieu du flux 480p :
Zone cadrée : (500, 375, 1 000, 750) (rapport hauteur/largeur 4:3)
Recadrage de flux 1024x1024 : (625, 375, 750, 750)
Recadrage de flux 1280x720 : (500, 469, 1000, 562)

région cultivée-43-carrés-rapport

Figure 4. Format d'image 4:3, carré

Retraitement

Une prise en charge supplémentaire des fichiers d'images brutes est fournie par la prise en charge du retraitement des données RAW Bayer. Cette prise en charge permet au pipeline de la caméra de traiter un tampon RAW et des métadonnées précédemment capturés (une image entière qui a été enregistrée précédemment), pour produire une nouvelle sortie YUV ou JPEG rendue.

Zoom

Pour les appareils fonctionnant sous Android 11 ou version ultérieure, une application peut utiliser le zoom (numérique et optique) d'un appareil photo via le paramètre ANDROID_CONTROL_ZOOM_RATIO .

Le taux de zoom est défini comme un facteur à virgule flottante. Au lieu d'utiliser ANDROID_SCALER_CROP_REGION pour le recadrage et le zoom, une application peut utiliser ANDROID_CONTROL_ZOOM_RATIO pour contrôler le niveau de zoom et utiliser ANDROID_SCALER_CROP_REGION pour le recadrage horizontal et vertical afin d'obtenir des proportions différentes de celles du capteur de caméra natif.

Un système multi-caméras peut contenir plusieurs objectifs avec des distances focales différentes, et l'utilisateur peut utiliser le zoom optique en basculant entre les objectifs. L'utilisation ANDROID_CONTROL_ZOOM_RATIO présente des avantages dans les scénarios ci-dessous :

  • Zoom avant d'un objectif grand angle à un téléobjectif : un rapport à virgule flottante offre une meilleure précision par rapport aux valeurs entières de ANDROID_SCALER_CROP_REGION .
  • Zoom arrière d'un objectif large à un objectif ultra-large : ANDROID_CONTROL_ZOOM_RATIO prend en charge le zoom arrière (<1,0f) alors que ANDROID_SCALER_CROP_REGION ne le fait pas.

Pour illustrer, voici plusieurs scénarios de différents taux de zoom, régions de recadrage et flux de sortie, en utilisant la même caméra hypothétique définie dans la section précédente.

Rapport de zoom : 2,0 ; 1/4 du champ de vision d'origine
Zone de recadrage : (0, 0, 2000, 1500) (rapport hauteur/largeur 4:3)
Recadrage de flux 640 x 480 : (0, 0, 2 000, 1 500) (égal à la région recadrée)
Recadrage de flux 1280x720 : (0, 187, 2000, 1125)

rapport de zoom-2-crop-43

Figure 5. Zoom 2.0, rapport hauteur/largeur 4:3

Rapport de zoom : 2,0 ; 1/4 du champ de vision d'origine
Zone cadrée : (0, 187, 2000, 1125) (rapport hauteur/largeur 16:9)
Recadrage de flux 640 x 480 : (250, 187, 1 500, 1 125) (en pilier)
Recadrage de flux 1280 x 720 : (0, 187, 2000, 1125) (égal à la région de recadrage)

rapport de zoom-2-crop-169

Figure 6. Zoom 2.0, format 16:9

Taux de zoom : 0,5 ; 4x du champ de vision d'origine (passage d'un objectif large à un objectif ultra-large)
Zone cadrée : (250, 0, 1 500, 1 500) (rapport hauteur/largeur 1:1)
Recadrage de flux 640 x 480 : (250, 187, 1 500, 1 125) (en boîte aux lettres)
Recadrage de flux 1 280 x 720 : (250, 328, 1 500, 844) (en boîte aux lettres)

images/zoom-ratio-0.5-crop-11

Figure 7. Zoom 0,5, rapport hauteur/largeur 1:1

Comme le montrent les graphiques ci-dessus, le système de coordonnées de la région cadrée devient le champ de vision effectif après zoom et est représenté par le rectangle aux dimensions suivantes : ( 0 , 0 , activeArrayWith , activeArrayHeight ). La même chose s’applique aux régions et visages AE/AWB/AF. Ce changement de système de coordonnées ne s'applique pas à la capture RAW et à ses métadonnées associées telles que intrinsicCalibration et lensShadingMap .

En utilisant le même exemple hypothétique ci-dessus, et en supposant que le flux de sortie n°1 (640 x 480) est le flux du viseur, un zoom 2,0x peut être obtenu de deux manières :

  • zoomRatio = 2.0 , scaler.cropRegion = (0, 0, 2000, 1500)
  • zoomRatio = 1.0 (par défaut), scaler.cropRegion = (500, 375, 1000, 750)

Pour qu'une application définisse android.control.aeRegions comme étant le quart supérieur gauche du champ de vision du viseur, définissez android.control.aeRegions sur (0, 0, 1000, 750) avec android.control.zoomRatio défini sur 2.0 . Alternativement, l'application peut définir android.control.aeRegions sur la région équivalente de (500, 375, 1000, 750) pour android.control.zoomRatio de 1.0 .