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 tous les formats de sortie. Plusieurs flux peuvent être configurés en même temps pour envoyer une seule image à de nombreuses cibles telles que le GPU, l'encodeur vidéo, RenderScript ou les 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 de mémoires tampons et la configuration du matériel de la caméra, de sorte que lorsque les demandes sont soumises avec des pipelines de sortie multiples ou variables répertoriés, il n'y aura pas de retard 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 du tableau complet de pixels (pour le zoom numérique et d'autres cas d'utilisation où un FOV plus petit est souhaitable) est communiqué via le paramètre ANDROID_SCALER_CROP_REGION. Il s'agit d'un paramètre par demande et peut changer sur une base par 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 réseau de pixels actifs du capteur, (0,0) étant le pixel supérieur gauche du réseau de pixels actifs. 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 HAL via le champ d'informations statiques ANDROID_SCALER_MAX_DIGITAL_ZOOM, qui décrit le facteur de zoom maximal pris en charge. Par conséquent, la largeur et la hauteur minimales de la zone cadré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 zone cadrée doit répondre à des exigences spécifiques (par exemple, elle doit commencer sur des coordonnées paires et sa largeur/hauteur doit être égale), la HAL doit effectuer l'arrondi nécessaire et écrire la zone cadrée finale utilisée dans la sortie. métadonnées des résultats. 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 de recadrage, 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 rapports d'aspect différents de la région cadrée, la région de capteur exacte utilisée pour chaque flux peut être plus petite que la région cadrée. Plus précisément, chaque flux doit conserver des pixels carrés et son rapport hauteur/largeur en recadrant un minimum la région de recadrage définie. Si le rapport d'aspect du flux est plus large que la zone de recadrage, le flux doit être davantage recadré verticalement, et si le rapport d'aspect du flux est plus étroit que la zone de recadrage, le flux doit être davantage recadré horizontalement.

Dans tous les cas, le flux de culture doit être centré dans la zone de culture complète, et chaque flux est uniquement cultivé 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 illustre les régions de sortie attendues pour chaque flux pour quelques exemples de régions cultivées, sur une hypothétique 3 Capteur MP (matrice 2000 x 1500 pixels).

Zone de recadrage : (500, 375, 1 000, 750) (format d'image 4:3)
Culture de flux 640 x 480 : (500, 375, 1 000, 750) (égale à la zone de culture)
Recadrage de flux 1280x720 : (500, 469, 1000, 562)

rapport-culture-région-43

Figure 1. Format d' image 4:3

Zone de recadrage : (500, 375, 1333, 750) (format d'image 16:9)
Recadrage de flux 640 x 480 : (666, 375, 1 000, 750)
Culture de flux 1280x720 : (500, 375, 1333, 750) (égale à la zone de culture)

rapport-culture-région-169

Figure 2. Format d' image 16:9

Zone de recadrage : (500, 375, 750, 750) (format d'image 1:1)
Recadrage de flux 640 x 480 : (500, 469, 750, 562)
Recadrage de flux 1280x720 : (500, 543, 750, 414)

rapport-culture-région-11

Figure 3. Format d' image 1:1

Et un dernier exemple, un flux au format carré 1024x1024 au lieu du flux 480p :
Zone de recadrage : (500, 375, 1 000, 750) (format d'image 4:3)
Recadrage de flux 1024x1024 : (625, 375, 750, 750)
Recadrage de flux 1280x720 : (500, 469, 1000, 562)

crop-region-43-square-ratio

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 exécutant Android 11 ou une version ultérieure, une application peut utiliser le zoom d'un appareil photo (numérique et optique) 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 rapports d'aspect différents de ceux du capteur de caméra natif.

Un système multi-caméras peut contenir plus d'un objectif avec différentes longueurs focales, et l'utilisateur peut utiliser le zoom optique en passant d'un objectif à l'autre. L'utilisation d' ANDROID_CONTROL_ZOOM_RATIO présente des avantages dans les scénarios ci-dessous :

  • Zoom avant d'un objectif large à 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, 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) (format d'image 4:3)
Recadrage de flux 640 x 480 : (0, 0, 2 000, 1 500) (égal à la zone de recadrage)
Recadrage de flux 1280x720 : (0, 187, 2000, 1125)

rapport-zoom-2-recadrage-43

Figure 5. Zoom 2.0, format d'image 4:3

Rapport de zoom : 2,0 ; 1/4 du champ de vision d'origine
Zone de recadrage : (0, 187, 2000, 1125) (format d'image 16:9)
Culture de flux 640x480 : (250, 187, 1500, 1125) (pilarboxed)
Culture de flux 1280x720 : (0, 187, 2000, 1125) (égal à la zone de culture)

rapport-zoom-2-recadrage-169

Figure 6. Zoom 2.0, format d'image 16:9

Rapport de zoom : 0,5 ; 4x du champ de vision d'origine (passage d'un objectif large à un objectif ultra large)
Zone de recadrage : (250, 0, 1 500, 1 500) (format d'image 1:1)
Recadrage de flux 640 x 480 : (250, 187, 1 500, 1 125) (boîte aux lettres)
Recadrage de flux 1280x720 : (250, 328, 1500, 844) (boîte aux lettres)

images/zoom-ratio-0.5-crop-11

Figure 7. Zoom 0,5, format d'image 1:1

Comme le montrent les graphiques ci-dessus, le système de coordonnées de la zone cadrée passe au champ de vision effectif après zoom et est représenté par le rectangle aux dimensions suivantes : ( 0 , 0 , activeArrayWith , activeArrayHeight ). Il en va de même pour les régions et les 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 #1 (640x480) est le flux du viseur, le 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 .