Flussi di output, ritaglio e zoom

Flussi di output

Il sottosistema della fotocamera funziona esclusivamente sulla pipeline basata su ANativeWindow per tutte le risoluzioni e formati di output. È possibile configurare più flussi contemporaneamente per inviare un singolo fotogramma a molte destinazioni come la GPU, il codificatore video, RenderScript o buffer visibili dall'app (RAW Bayer, buffer YUV elaborati o buffer con codifica JPEG).

Come ottimizzazione, questi flussi di output devono essere configurati in anticipo e può esisterne solo un numero limitato contemporaneamente. Ciò consente la preallocazione dei buffer di memoria e la configurazione dell'hardware della fotocamera, in modo che quando le richieste vengono inviate con pipeline di output multiple o variabili elencate, non ci saranno ritardi o latenza nel soddisfare la richiesta.

Per ulteriori informazioni sulle combinazioni di output del flusso garantite che dipendono dal livello hardware supportato, vedere createCaptureSession() .

Ritaglio

Il ritaglio dell'intero array di pixel (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 specifica per richiesta e può cambiare in base alla richiesta, il che è fondamentale per implementare uno zoom digitale uniforme.

La regione è definita come un rettangolo (x, y, larghezza, altezza), con (x, y) che descrive l'angolo superiore sinistro del rettangolo. Il rettangolo è definito sul sistema di coordinate della matrice di pixel attivi del sensore, dove (0,0) è il pixel in alto a sinistra della matrice di pixel attivi. Pertanto, la larghezza e l'altezza non possono essere maggiori delle dimensioni riportate nel campo delle informazioni statiche ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. La larghezza e l'altezza minime consentite vengono segnalate dall'HAL tramite il campo informativo statico 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 nell'output metadati dei risultati. Allo stesso modo, se l'HAL implementa la stabilizzazione video, deve regolare la regione di ritaglio risultante per descrivere la regione effettivamente inclusa nell'output dopo l'applicazione della stabilizzazione video. In generale, un'applicazione che utilizza una fotocamera deve essere in grado di determinare il campo visivo che sta ricevendo in base alla regione di ritaglio, alle dimensioni del sensore di immagine e alla lunghezza focale dell'obiettivo.

Poiché la regione ritagliata si applica a tutti i flussi, che possono avere proporzioni diverse rispetto alla regione ritagliata, l'esatta regione del sensore utilizzata per ciascun flusso potrebbe essere più piccola della regione ritagliata. Nello specifico, ciascun flusso deve mantenere i pixel quadrati e le relative proporzioni ritagliando ulteriormente la regione di ritaglio definita. Se le proporzioni del flusso sono più larghe della regione ritagliata, il flusso dovrebbe essere ulteriormente ritagliato verticalmente, mentre se le proporzioni del flusso sono più strette della regione ritagliata, il flusso dovrebbe essere ulteriormente ritagliato orizzontalmente.

In tutti i casi, il raccolto del ruscello deve essere centrato all'interno della regione dell'intero raccolto e ciascun ruscello viene tagliato solo orizzontalmente o verticalmente rispetto all'intera regione del raccolto, mai entrambi.

Ad esempio, se vengono definiti due flussi, un flusso 640x480 (aspetto 4:3) e un flusso 1280x720 (aspetto 16:9), di seguito vengono mostrate le regioni di output previste per ciascun flusso per alcune regioni di coltura campione, su un ipotetico 3 Sensore MP (array di pixel 2000 x 1500).

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

rapporto regione-coltura-43

Figura 1. Proporzioni 4:3

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

rapporto-regione-169-coltura

Figura 2. Proporzioni 16:9

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

rapporto coltura-regione-11

Figura 3. Proporzioni 1:1

E un ultimo esempio, uno stream con proporzioni quadrate 1024x1024 invece dello stream 480p:
Regione ritagliata: (500, 375, 1000, 750) (proporzioni 4:3)
Ritaglio flusso 1024x1024: (625, 375, 750, 750)
Ritaglio flusso 1280x720: (500, 469, 1000, 562)

rapporto-regione-di-coltura-43-quadrati

Figura 4. Proporzioni 4:3, quadrato

Rielaborazione

Ulteriore supporto per i file di immagini RAW viene fornito rielaborando il supporto per i dati RAW Bayer. Questo supporto consente alla pipeline della fotocamera di elaborare un buffer RAW e metadati precedentemente acquisiti (un intero fotogramma registrato in precedenza), per produrre un nuovo output YUV o JPEG renderizzato.

Ingrandisci

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

Il rapporto di zoom è definito come un fattore in virgola mobile. Invece di utilizzare ANDROID_SCALER_CROP_REGION per ritagliare e ingrandire, un'app può utilizzare ANDROID_CONTROL_ZOOM_RATIO per controllare il livello di zoom e utilizzare ANDROID_SCALER_CROP_REGION per il ritaglio orizzontale e verticale per ottenere proporzioni diverse rispetto al sensore nativo della fotocamera.

Un sistema multi-camera 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 ANDROID_CONTROL_ZOOM_RATIO presenta vantaggi negli scenari seguenti:

  • Zoom avanti da un obiettivo grandangolare a un teleobiettivo: un rapporto in virgola mobile fornisce una precisione migliore rispetto ai valori interi di ANDROID_SCALER_CROP_REGION .
  • Zoom indietro 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 illustrare, ecco diversi scenari di diversi rapporti di zoom, regioni di ritaglio e flussi di output, utilizzando la stessa ipotetica telecamera definita nella sezione precedente.

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

rapporto-zoom-2-ritaglio-43

Figura 5. Zoom 2.0, proporzioni 4:3

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

rapporto-zoom-2-ritaglio-169

Figura 6. Zoom 2.0, proporzioni 16:9

Rapporto 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)
Ritaglio flusso 640x480: (250, 187, 1500, 1125) (letterbox)
Ritaglio flusso 1280x720: (250, 328, 1500, 844) (letterbox)

immagini/zoom-ratio-0.5-crop-11

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

Come visto 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 e i volti AE/AWB/AF. 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 sopra e presupponendo che il flusso di output n. 1 (640x480) sia il flusso del mirino, è possibile ottenere uno zoom 2,0x in due modi:

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

Affinché un'app imposti android.control.aeRegions in modo che sia 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 .