Flussi di output, ritaglio e zoom

Flussi di uscita

Il sottosistema della telecamera opera esclusivamente sulla pipeline basata su ANativeWindow per tutte le risoluzioni e tutti i formati di output. Più flussi possono essere configurati in una sola volta per inviare un singolo frame di molti obiettivi come la GPU, il codificatore video, RenderScript o tamponi app-visibile (RAW Bayer, buffer YUV trasformati, o buffer JPEG codificati).

Come ottimizzazione, questi flussi di output devono essere configurati in anticipo e solo un numero limitato può esistere contemporaneamente. Ciò consente la pre-allocazione 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 maggiori informazioni su combinazioni di uscita flusso garantiti 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 è desiderabile un FOV più piccolo) viene comunicato tramite l'impostazione ANDROID_SCALER_CROP_REGION. Questa è un'impostazione per richiesta e può cambiare in base alla richiesta, che è fondamentale per l'implementazione di uno zoom digitale fluido.

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 dell'array di pixel attivi del sensore, dove (0,0) è il pixel in alto a sinistra dell'array di pixel attivo. Pertanto, la larghezza e l'altezza non possono essere maggiori delle dimensioni riportate nel campo di informazioni statiche ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. La larghezza e l'altezza minime consentite sono riportate 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 su coordinate pari e la sua larghezza/altezza deve essere uniforme), l'HAL deve eseguire gli arrotondamenti necessari 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 del risultato 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 all'area 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 possono avere rapporti di aspetto differenti rispetto alla regione di ritaglio, l'esatta regione del sensore utilizzata per ciascun flusso può essere più piccola della regione di ritaglio. In particolare, ogni flusso dovrebbe mantenere i pixel quadrati e le sue proporzioni ritagliando ulteriormente la regione di ritaglio definita. Se le proporzioni del flusso sono più larghe della regione di ritaglio, il flusso dovrebbe essere ulteriormente ritagliato verticalmente e se le proporzioni del flusso sono più strette della regione di ritaglio, il flusso dovrebbe essere ulteriormente ritagliato orizzontalmente.

In tutti i casi, il ritaglio del flusso deve essere centrato all'interno della regione di ritaglio completo e ciascun flusso viene ritagliato solo orizzontalmente o verticalmente rispetto all'area di ritaglio completo, 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 illustrate le regioni di output previste per ogni flusso per alcune regioni di coltura campione, su un ipotetico 3 Sensore MP (2000 x 1500 pixel array).

Regione di ritaglio: (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)

regione-coltura-43-rapporto

Figura 1. 4: 3 aspect ratio

Regione di ritaglio: (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)

regione di coltivazione-169-rapporto

Figura 2. 16: 9 aspect ratio

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

rapporto 11-regione di coltivazione

Figura 3. 1: 1 rapporto di aspetto

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

regione-ritaglio-43-quadrato-rapporto

Figura 4. 4: 3 aspect ratio, quadrato

Rielaborazione

Il supporto aggiuntivo per i file di immagine RAW è fornito dal supporto di rielaborazione 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 superiore, un'applicazione può utilizzare lo zoom di una telecamera (ottico e digitale) attraverso ANDROID_CONTROL_ZOOM_RATIO impostazione.

Il rapporto di zoom è definito come un fattore a virgola mobile. Invece di utilizzare ANDROID_SCALER_CROP_REGION per colture e zoom, un'applicazione può utilizzare ANDROID_CONTROL_ZOOM_RATIO per controllare il livello di zoom e uso ANDROID_SCALER_CROP_REGION per il ritaglio orizzontale e verticale per ottenere proporzioni diverse rispetto al sensore telecamera nativo.

Un sistema multi-camera può contenere più di un obiettivo con diverse lunghezze focali e l'utente può utilizzare lo zoom ottico passando da un obiettivo all'altro. Utilizzando ANDROID_CONTROL_ZOOM_RATIO ha benefici negli scenari di seguito:

  • Lo zoom da un obiettivo grandangolare ad un teleobiettivo: Un rapporto virgola mobile fornisce una migliore precisione rispetto ai valori interi di ANDROID_SCALER_CROP_REGION .
  • Lo zoom fuori da una vasta lente per un obiettivo ultrawide: ANDROID_CONTROL_ZOOM_RATIO supporti zoom-out (<1.0f), mentre ANDROID_SCALER_CROP_REGION non lo fa.

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 ingrandimento: 2.0; 1/4 del campo visivo originale
Regione di ritaglio: (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 di zoom-2-ritaglio-43

Figura 5. 2.0 zoom, 4: 3 aspect ratio

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

rapporto di zoom-2-ritaglio-169

Figura 6. 2.0 zoom, 16: 9

Rapporto di ingrandimento: 0,5; 4x del campo visivo originale (passato da obiettivo grandangolare a obiettivo ultrawide)
Regione di ritaglio: (250, 0, 1500, 1500) (proporzioni 1:1)
Ritaglio flusso 640x480: (250, 187, 1500, 1125) (in formato letterbox)
Ritaglio flusso 1280x720: (250, 328, 1500, 844) (in formato letterbox)

immagini/rapporto di zoom-0.5-crop-11

Figura 7. 0.5 zoom, rapporto 1: 1 aspetto

Come si vede dai grafici di cui sopra, il sistema della regione coltura modifiche al campo efficace dopo-zoom di vista coordinate, ed è rappresentato dal rettangolo con le seguenti dimensioni: ( 0 , 0 , activeArrayWith , activeArrayHeight ). Lo stesso vale per le regioni e i volti AE/AWB/AF. Questo cambiamento del sistema di coordinate non si applica alla cattura RAW e la sua relativi metadati quali intrinsicCalibration e lensShadingMap .

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

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

Per un'applicazione per impostare android.control.aeRegions di essere il quarto superiore sinistro del campo visivo mirino, impostare android.control.aeRegions a (0, 0, 1000, 750) con android.control.zoomRatio impostato a 2.0 . In alternativa, l'applicazione può impostare android.control.aeRegions alla regione equivalente di (500, 375, 1000, 750) per android.control.zoomRatio di 1.0 .