Stream di output, ritaglio e zoom

Flussi di output

Il sottosistema della fotocamera opera esclusivamente sulla pipeline basata su A NativeWindow per tutte le risoluzioni e i formati di output. È possibile configurare più stream all'indirizzo una volta per inviare un singolo frame a più destinazioni come GPU, il video dell'encoder, RenderScript o buffer visibili all'app (RAW Bayer, YUV elaborato buffer o buffer con codifica JPEG).

Come ottimizzazione, questi flussi di output devono essere configurati in anticipo e può esistere un solo numero limitato alla volta. Ciò consente la pre-allocazione di buffer di memoria e la configurazione dell'hardware della videocamera, in modo che vengono inviate con più o varie pipeline di output elencate, non saranno ritardi o latenza nel soddisfare la richiesta.

Per saperne di più sulle combinazioni di output di stream garantiti che dipendono dal livello di hardware supportato, consulta createCaptureSession().

Ritaglio

Ritaglio dell'array di pixel completo (per lo zoom digitale e altri casi d'uso in cui un campo visivo più piccolo è auspicabile) viene comunicato tramite ANDROID_SCALER_CROP_REGION dell'ambientazione. Si tratta di un'impostazione a livello di richiesta e può essere modificata in base alla richiesta. fondamentale per implementare lo zoom digitale senza problemi.

L'area è definita come un rettangolo (x, y, larghezza, altezza), con (x, y) che descrive l'angolo in alto a sinistra del rettangolo. Il rettangolo è definito sistema di coordinate dell'array di pixel attivi del sensore, dove (0,0) è il pixel in alto a sinistra dell'array di pixel attivi. Pertanto, la larghezza e l'altezza non possono essere più grande delle dimensioni segnalate nel formato ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY campo informativo statico. La larghezza e l'altezza minime consentite sono indicate dall'HAL tramite il campo informazioni statiche ANDROID_SCALER_MAX_DIGITAL_ZOOM, che descrive il fattore di zoom massimo supportato. Di conseguenza, la larghezza minima dell'area di ritaglio sono:

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

Se l'area ritagliata deve soddisfare requisiti specifici (ad esempio, deve in modo da iniziare da coordinate pari e la sua larghezza/altezza deve essere uniforme), l'HAL occorre eseguire l'arrotondamento necessario e scrivere l'area di ritaglio finale utilizzata nelle metadati dei risultati di output. Analogamente, se l'HAL implementa la stabilizzazione video, devi regolare la regione ritagliata dei risultati per descrivere la regione effettivamente inclusa l'output dopo aver applicato la stabilizzazione video. In generale, una videocamera che utilizza L'app deve essere in grado di determinare il campo visivo che riceve in base al area di ritaglio, dimensioni del sensore fotografico e lunghezza focale dell'obiettivo.

Poiché l'area ritagliata si applica a tutti i flussi, che possono avere aspetti diversi superiori rispetto all'area di ritaglio, l'esatta regione del sensore utilizzata per ciascun flusso può essere minore dell'area ritagliata. Nello specifico, ogni stream deve mantenere una pixel e le relative proporzioni ritagliando leggermente il ritaglio definito. regione. Se le proporzioni dello stream sono più ampie dell'area ritagliata, lo stream deve essere ritagliato ulteriormente in verticale e se le proporzioni dello stream sono più stretto dell'area coltivata, il flusso deve essere ritagliato ulteriormente in orizzontale.

In ogni caso, il ritaglio del flusso deve essere centrato all'interno dell'intera area di ritaglio. gli stream vengono ritagliati solo orizzontalmente o verticalmente rispetto all'immagine regione di ritaglio, mai entrambe.

Ad esempio, se vengono definiti due stream, uno stream da 640 x 480 (con aspetto 4:3) e uno Lo stream 1280 x 720 (aspetto 16:9) di seguito mostra le regioni di output previste per ogni flusso per alcune regioni di ritaglio campione, su un'immagine ipotetica di 3 MP (2000 x 1500 pixel).

Regione ritagliata: (500, 375, 1000, 750) (proporzioni 4:3)
Flusso di ritaglio 640 x 480: (500, 375, 1000, 750) (uguale all'area di ritaglio)
1280 x 720 ritaglio flusso: (500, 469, 1000, 562)

rapporto-regione-coltura-43

Figura 1. Proporzioni di 4:3

Regione ritagliata: (500, 375, 1333, 750) (proporzioni 16:9)
Flusso di ritaglio 640 x 480: (666, 375, 1000, 750)
1280 x 720 flusso di ritaglio: (500, 375, 1333, 750) (uguale all'area di ritaglio)

rapporto-regione-coltura-169

Figura 2. Proporzioni di 16:9

Regione ritagliata: (500, 375, 750, 750) (proporzioni 1:1)
Flusso di ritaglio 640 x 480: (500, 469, 750, 562)
Ritaglio flusso 1280 x 720: (500, 543, 750, 414)

rapporto-regione-11-coltura

Figura 3. Proporzioni 1:1

Un ultimo esempio: uno stream con proporzioni quadrate di 1024 x 1024 anziché quello da 480 p stream:
Regione ritagliata: (500, 375, 1000, 750) (proporzioni 4:3)
Ritaglio flusso 1024 x 1024: (625, 375, 750, 750)
Ritaglio flusso 1280 x 720: (500, 469, 1000, 562)

regione-coltura-43-rapporto-quadrato

Figura 4. Proporzioni 4:3, quadrate

Rielaborazione

Il supporto aggiuntivo per i file immagine non elaborati è fornito dal supporto della rielaborazione per RAW Bayer e i dati di Google Cloud. Questo supporto consente alla pipeline della fotocamera di elaborare i dati acquisiti in precedenza buffer RAW e metadati (un intero frame registrato in precedenza), per produce un nuovo output YUV o JPEG visualizzato.

Zoom

Per i dispositivi con Android 11 o versioni successive, un'app può utilizzare lo zoom di una fotocamera (digitali e ottici) tramite l'impostazione ANDROID_CONTROL_ZOOM_RATIO.

Il rapporto di zoom è definito come fattore con rappresentazione in virgola mobile. Invece di utilizzando ANDROID_SCALER_CROP_REGION per il ritaglio e lo zoom, un'app può usare ANDROID_CONTROL_ZOOM_RATIO per controllare il livello di zoom e usa ANDROID_SCALER_CROP_REGION per il ritaglio orizzontale e verticale per avere proporzioni diverse rispetto al sensore nativo della fotocamera.

Un sistema multicamera può contenere più di un obiettivo con diverse e l'utente può utilizzare lo zoom ottico passando da un obiettivo all'altro. L'utilizzo di ANDROID_CONTROL_ZOOM_RATIO offre vantaggi negli scenari seguenti:

  • Aumentare lo zoom da un obiettivo grandangolare a un teleobiettivo: rapporto in virgola mobile offre una precisione migliore rispetto ai valori interi di ANDROID_SCALER_CROP_REGION.
  • Diminuisci lo zoom da un obiettivo grandangolare a un obiettivo ultrawide: ANDROID_CONTROL_ZOOM_RATIO supporta lo zoom indietro (<1,0f) mentre ANDROID_SCALER_CROP_REGION no.

Per spiegarci meglio, ecco diversi scenari di diversi rapporti di zoom, aree di ritaglio e output utilizzando la stessa ipotetica videocamera definita nella sezione precedente.

Fattore di zoom: 2,0; 1/4 del campo visivo originale
Regione ritagliata: (0, 0, 2000, 1500) (proporzioni 4:3)
Flusso di ritaglio 640 x 480: (0, 0, 2000, 1500) (uguale all'area ritagliata)
1280 x 720 ritaglio flusso: (0, 187, 2000, 1125)

rapporto-zoom-2-ritaglio-43

Figura 5. Zoom 2.0, proporzioni 4:3

Fattore di zoom: 2,0; 1/4 del campo visivo originale
Regione ritagliata: (0, 187, 2000, 1125) (proporzioni 16:9)
Flusso di ritaglio 640 x 480: (250, 187, 1500, 1125) (pillarbox)
1280 x 720 flusso di ritaglio: (0, 187, 2000, 1125) (uguale alla regione di ritaglio)

rapporto-zoom-2-ritaglio-169

Figura 6. Zoom 2.0, proporzioni 16:9

Fattore di zoom: 0,5; 4x del campo visivo originale (passato da obiettivo grandangolare a obiettivo ultrawide)
Regione ritagliata: (250, 0, 1500, 1500) (proporzioni 1:1)
Flusso di ritaglio 640 x 480: (250, 187, 1500, 1125) (letterbox)
1280 x 720 ritaglio flusso: (250, 328, 1500, 844) (letterbox)

immagini/rapporto-zoom-0,5-ritaglio-11

Figura 7. Zoom 0,5, proporzioni 1:1

Come si vede dai grafici qui sopra, il sistema di coordinate dell'area coltivato cambia nel campo visivo dopo lo zoom ed è rappresentato dal rettangolo con le seguenti dimensioni: (0, 0, activeArrayWith, activeArrayHeight). Lo stesso vale per le regioni e i volti AE/AWB/AF. Questa modifica del sistema di coordinate non si applica a Acquisizione RAW e relativi metadati, come intrinsicCalibration e lensShadingMap.

Utilizzando lo stesso esempio ipotetico di cui sopra e supponendo che il flusso di output n. 1 (640x480) sia con il mirino, lo zoom 2.0x può essere ottenuto in due modi:

  • zoomRatio = 2.0, scaler.cropRegion = (0, 0, 2000, 1500)
  • zoomRatio = 1.0 (predefinito), scaler.cropRegion = (500, 375, 1000, 750)

Per fare in modo che un'app imposti android.control.aeRegions in alto a sinistra quarto del campo visivo del mirino, imposta Da android.control.aeRegions a (0, 0, 1000, 750) con android.control.zoomRatio impostato su 2.0. In alternativa, l'app può impostare android.control.aeRegions allo equivalente regione di (500, 375, 1000, 750) per android.control.zoomRatio di 1.0.