Stream di output, ritaglio e zoom

Questa pagina descrive il funzionamento e l'ottimizzazione della fotocamera, inclusi flussi di output, ritaglio, rielaborazione e zoom.

Flussi di output

Il sottosistema della fotocamera funziona esclusivamente sulla pipeline basata su ANativeWindow per tutte le risoluzioni e i formati di output. È possibile configurare più flussi contemporaneamente per inviare un singolo frame a molti target, come la GPU, il codificatore video, RenderScript, o i buffer visibili all'app (buffer RAW Bayer, buffer YUV elaborati o buffer codificati in JPEG).

Per l'ottimizzazione, questi flussi di output devono essere configurati in anticipo e può esisterne solo un numero limitato alla volta. Ciò consente la pre-allocazione dei buffer di memoria e la configurazione dell'hardware della fotocamera, in modo che quando vengono inviate richieste con più pipeline di output o pipeline di output variabili elencate, non si verifichino ritardi o latenza nell'evasione della richiesta.

Per ulteriori informazioni sulle combinazioni di output dei flussi garantite che dipendono dal livello hardware supportato, vedi createCaptureSession.

Ritaglio

Il ritaglio dell'array di pixel completo (per lo zoom digitale e altri casi d'uso in cui è auspicabile un FOV più piccolo) viene comunicato tramite l'impostazione ANDROID_SCALER_CROP_REGION. Si tratta di un'impostazione per richiesta e può cambiare in base alla richiesta, il che è fondamentale per implementare uno zoom digitale fluido.

La regione è definita come un rettangolo (x, y, larghezza, altezza), con (x, y) che descrive l'angolo in alto a sinistra del rettangolo. Il rettangolo è definito sul sistema di coordinate dell'array di pixel attivi del sensore, con (0,0) che rappresenta il pixel in alto a sinistra dell'array di pixel attivi. Pertanto, la larghezza e l'altezza non possono essere maggiori delle dimensioni riportate nel ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY campo di informazioni statiche. La larghezza e l'altezza minime consentite vengono segnalate dall'HAL tramite il campo di informazioni statiche ANDROID_SCALER_MAX_DIGITAL_ZOOM, che descrive il fattore di zoom massimo supportato. Pertanto, la larghezza e l'altezza minime della regione 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 la regione di ritaglio deve soddisfare requisiti specifici (ad esempio, deve iniziare con coordinate pari e la sua larghezza/altezza deve essere pari), l'HAL deve eseguire l'arrotondamento necessario e scrivere la regione di ritaglio finale utilizzata nei metadati del risultato di output. Allo stesso modo, se l'HAL implementa la stabilizzazione video, deve regolare la regione di ritaglio del risultato per descrivere la regione effettivamente inclusa nell'output dopo l'applicazione della stabilizzazione video. In generale, un'app che utilizza la fotocamera deve essere in grado di determinare il campo visivo che riceve in base alla regione di ritaglio, alle dimensioni del sensore di immagine e alla lunghezza focale dell'obiettivo.

Poiché la regione di ritaglio si applica a tutti i flussi, che potrebbero avere proporzioni diverse rispetto alla regione di ritaglio, la regione del sensore esatta utilizzata per ogni flusso potrebbe essere più piccola della regione di ritaglio. In particolare, ogni flusso deve mantenere i pixel quadrati e le proporzioni ritagliando ulteriormente la regione di ritaglio definita. Se le proporzioni del flusso sono più ampie della regione di ritaglio, il flusso deve essere ritagliato ulteriormente in verticale; se le proporzioni del flusso sono più strette della regione di ritaglio, il flusso deve essere ritagliato ulteriormente in orizzontale.

In tutti i casi, il ritaglio del flusso deve essere centrato all'interno della regione di ritaglio completa e ogni flusso viene ritagliato solo in orizzontale o in verticale rispetto alla regione di ritaglio completa, mai in entrambi i modi.

Ad esempio, se sono definiti due flussi, un flusso 640x480 (proporzioni 4:3) e un flusso 1280x720 (proporzioni 16:9), di seguito vengono mostrate le regioni di output previste per ogni flusso per alcune regioni di ritaglio di esempio, su un sensore ipotetico da 3 MP (array di pixel 2000 x 1500).

Regione di ritaglio: (500, 375, 1000, 750) (proporzioni 4:3)
Ritaglio del flusso 640x480: (500, 375, 1000, 750) (uguale alla regione di ritaglio)
Ritaglio del flusso 1280x720: (500, 469, 1000, 562)

crop-region-43-ratio

Figura 1. Proporzioni di 4:3

Regione di ritaglio: (500, 375, 1333, 750) (proporzioni 16:9)
Ritaglio del flusso 640x480: (666, 375, 1000, 750)
Ritaglio del flusso 1280x720: (500, 375, 1333, 750) (uguale alla regione di ritaglio)

crop-region-169-ratio

Figura 2. Proporzioni 16:9

Regione di ritaglio: (500, 375, 750, 750) (proporzioni 1:1)
Ritaglio del flusso 640x480: (500, 469, 750, 562)
Ritaglio del flusso 1280x720: (500, 543, 750, 414)

crop-region-11-ratio

Figura 3. Proporzioni 1:1

E un ultimo esempio, un flusso con proporzioni quadrate 1024x1024 anziché il flusso 480p stream:
Regione di ritaglio: (500, 375, 1000, 750) (proporzioni 4:3)
Ritaglio del flusso 1024x1024: (625, 375, 750, 750)
Ritaglio del flusso 1280x720: (500, 469, 1000, 562)

crop-region-43-square-ratio

Figura 4. Proporzioni 4:3, quadrate

Rielaborazione

Il supporto aggiuntivo per i file di immagini RAW è fornito dal supporto per la rielaborazione dei dati RAW Bayer. Questo supporto consente alla pipeline della fotocamera di elaborare un buffer RAW e metadati acquisiti in precedenza (un intero frame registrato in precedenza) per produrre un nuovo output YUV o JPEG sottoposto a rendering.

Zoom

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

Il rapporto di zoom è definito come un fattore a virgola mobile. Anziché utilizzare ANDROID_SCALER_CROP_REGION per il ritaglio e lo zoom, un'app può utilizzare ANDROID_CONTROL_ZOOM_RATIO per controllare il livello di zoom e ANDROID_SCALER_CROP_REGION per il ritaglio orizzontale e verticale per ottenere proporzioni diverse dal sensore della fotocamera nativa.

Un sistema di più fotocamere può contenere più di un obiettivo con lunghezze focali 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 riportati di seguito:

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

Per illustrare, ecco alcuni scenari di diversi rapporti di zoom, regioni di ritaglio e flussi di output, utilizzando la stessa fotocamera ipotetica definita nella sezione precedente.

Rapporto di zoom: 2,0; 1/4 del campo visivo originale
Regione di ritaglio: (0, 0, 2000, 1500) (proporzioni 4:3)
Ritaglio del flusso 640x480: (0, 0, 2000, 1500) (uguale alla regione di ritaglio)
Ritaglio del flusso 1280x720: (0, 187, 2000, 1125)

zoom-ratio-2-crop-43

Figura 5. Zoom 2.0, proporzioni 4:3

Rapporto di zoom: 2,0; 1/4 del campo visivo originale
Regione di ritaglio: (0, 187, 2000, 1125) (proporzioni 16:9)
Ritaglio del flusso 640x480: (250, 187, 1500, 1125) (pillarbox)
Ritaglio del flusso 1280x720: (0, 187, 2000, 1125) (uguale alla regione di ritaglio)

zoom-ratio-2-crop-169

Figura 6. Zoom 2.0, proporzioni 16:9

Rapporto di zoom: 0,5; 4x del campo visivo originale (passaggio dall'obiettivo grandangolare all'obiettivo ultrawide)
Regione di ritaglio: (250, 0, 1500, 1500) (proporzioni 1:1)
Ritaglio del flusso 640x480: (250, 187, 1500, 1125) (letterbox)
Ritaglio del flusso 1280x720: (250, 328, 1500, 844) (letterbox)

images/zoom-ratio-0.5-crop-11

Figura 7. Zoom 0.5, proporzioni 1:1

Come si può notare dai grafici sopra, il sistema di coordinate della regione di ritaglio cambia nel campo visivo effettivo dopo lo zoom ed è rappresentato dal rettangolo con le seguenti dimensioni: (0, 0, activeArrayWith, activeArrayHeight). Lo stesso vale per le regioni AE/AWB/AF e i volti. Questa modifica del sistema di coordinate non si applica all'acquisizione RAW e ai relativi metadati, come intrinsicCalibration e lensShadingMap.

Utilizzando lo stesso esempio ipotetico riportato sopra e supponendo che il flusso di output n. 1 (640x480) sia il flusso del mirino, è possibile ottenere uno zoom 2.0x in uno dei due modi seguenti:

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

Affinché un'app imposti android.control.aeRegions come il quarto in alto a sinistra del campo visivo del mirino, imposta android.control.aeRegions su (0, 0, 1000, 750) con android.control.zoomRatio impostato su 2.0. In alternativa, l'app può impostare android.control.aeRegions sulla regione equivalente di (500, 375, 1000, 750) per android.control.zoomRatio di 1.0.