Transmisiones de salida, recorte y zoom

Transmisiones de salida

El subsistema de la cámara opera únicamente en la canalización basada en ANativeWindow para todas las resoluciones y formatos de salida. Se pueden configurar varias transmisiones a la vez para enviar un solo fotograma a distintos destinos, como la GPU, el codificador de video, RenderScript o los búferes visibles para la app (RAW Bayer, búferes YUV procesados o con codificación JPEG).

Como optimización, estas transmisiones de salida se deben configurar con anticipación y solo puede existir una cantidad limitada a la vez. Esto permite la preasignación de búferes de memoria y la configuración del hardware de la cámara, de modo que, cuando se envíen solicitudes con varias o diferentes canalizaciones de salida, no haya demoras ni latencia en la entrega de la solicitud.

Para obtener más información sobre las combinaciones de salida de transmisión garantizadas que dependen del nivel de hardware compatible, consulta createCaptureSession().

Recortes

El recorte del array de píxeles completo (para el zoom digital y otros casos de uso en los que se desea un FOV más pequeño) se comunica a través de la configuración ANDROID_SCALER_CROP_REGION. Este es un parámetro de configuración por solicitud y puede cambiar según la solicitud, lo que es fundamental para implementar un zoom digital fluido.

La región se define como un rectángulo (x, y, ancho, alto), con (x, y) que describe la esquina superior izquierda del rectángulo. El rectángulo se define en el sistema de coordenadas del array de píxeles activos del sensor, donde (0,0) es el píxel superior izquierdo del array de píxeles activos. Por lo tanto, el ancho y la altura no pueden ser más grandes que las dimensiones registradas en el campo de información estática ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. El HAL informa el ancho y la altura mínimos permitidos a través del campo de información estática ANDROID_SCALER_MAX_DIGITAL_ZOOM, que describe el factor de zoom máximo admitido. Por lo tanto, el ancho y la altura mínimos de la región de recorte son los siguientes:

  {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 región de recorte debe cumplir con requisitos específicos (por ejemplo, debe comenzar con coordenadas pares y su ancho o altura deben ser uniformes), la HAL debe realizar el redondeo necesario y escribir la región de recorte final que se usa en los metadatos del resultado de salida. De manera similar, si la HAL implementa la estabilización de video, debe ajustar la región de recorte del resultado para describir la región que realmente se incluye en la salida después de aplicar la estabilización de video. En general, una app que usa una cámara debe poder determinar el campo visual que recibe en función de la región de recorte, las dimensiones del sensor de la imagen y la longitud focal de la lente.

Dado que la región de recorte se aplica a todas las transmisiones, que pueden tener relaciones de aspecto diferentes a las de la región de recorte, la región exacta del sensor que se usa para cada transmisión puede ser más pequeña que la región de recorte. Específicamente, cada transmisión debe mantener píxeles cuadrados y su relación de aspecto recortando mínimamente la región de recorte definida. Si la relación de aspecto de la transmisión es más ancha que la región de recorte, la transmisión se debe recortar más verticalmente. Si la relación de aspecto de la transmisión es más estrecha que la región de recorte, la transmisión se debe recortar más horizontalmente.

En todos los casos, el recorte de la transmisión debe estar centrado dentro de la región de recorte completa, y cada transmisión solo se recorta horizontal o verticalmente en relación con la región de recorte completa, nunca ambas.

Por ejemplo, si se definen dos transmisiones, una de 640 × 480 (relación de aspecto 4:3) y una de 1280 × 720 (relación de aspecto 16:9), a continuación, se muestran las regiones de salida esperadas para cada transmisión para algunas regiones de recorte de muestra, en un sensor hipotético de 3 MP (array de 2,000 × 1,500 píxeles).

Región de recorte: (500, 375, 1000, 750) (relación de aspecto de 4:3)
Recorte de transmisión de 640 × 480: (500, 375, 1000, 750) (igual que la región de recorte)
Recorte de transmisión de 1280 × 720: (500, 469, 1000, 562)

crop-region-43-ratio

Figura 1: Proporción de 4:3

Región de recorte: (500, 375, 1333, 750) (relación de aspecto 16:9)
Recorte de transmisión de 640 x 480: (666, 375, 1000, 750)
Recorte de transmisión de 1280 x 720: (500, 375, 1,333, recorte de transmisión igual a 1333)

Proporción de cultivos entre 169 y 169

Figura 2: Relación de aspecto de 16:9

Región de recorte: (500, 375, 750, 750) (relación de aspecto 1:1)
Recorte de transmisión de 640 × 480: (500, 469, 750, 562)
Recorte de transmisión de 1280 × 720: (500, 543, 750, 414)

relación-región-11-de-cultivo

Figura 3: Relación de aspecto de 1:1

Y, como último ejemplo, una transmisión con una relación de aspecto cuadrada de 1,024 × 1,024 en lugar de la transmisión de 480p:
Región de recorte: (500, 375, 1,000, 750) (relación de aspecto de 4:3)
Recorte de transmisión de 1,024 × 1,024: (625, 375, 750, 750)
Recorte de transmisión de 1,280 × 720: (500, 469, 1,000, 562)

cosecha región-43-relación-cuadrada

Figura 4: Relación de aspecto de 4:3, cuadrada

Reprocesamiento

La compatibilidad adicional para archivos de imágenes sin procesar se proporciona a través de la compatibilidad con el procesamiento nuevamente de los datos Bayer sin procesar. Esta compatibilidad permite que la canalización de la cámara procese un búfer y metadatos RAW capturados anteriormente (un fotograma completo que se grabó anteriormente) para producir una nueva salida renderizada de YUV o JPEG.

Zoom

En dispositivos que ejecutan Android 11 o versiones posteriores, una app puede usar el zoom de la cámara (digital y óptico) a través de la configuración ANDROID_CONTROL_ZOOM_RATIO.

La relación de zoom se define como un factor de punto flotante. En lugar de usar ANDROID_SCALER_CROP_REGION para recortar y acercar, una app puede usar ANDROID_CONTROL_ZOOM_RATIO para controlar el nivel de zoom y usar ANDROID_SCALER_CROP_REGION para recortar horizontal y verticalmente para lograr relaciones de aspecto diferentes a las del sensor de cámara nativo.

Un sistema de varias cámaras puede contener más de un lente con diferentes distancias focales, y el usuario puede usar el zoom óptico cambiando de lente. Usar ANDROID_CONTROL_ZOOM_RATIO tiene beneficios en las siguientes situaciones:

  • Acercamiento de un lente gran angular a un lente teleobjetivo: Una proporción de punto flotante proporciona una mejor precisión en comparación con los valores enteros de ANDROID_SCALER_CROP_REGION.
  • Alejar un lente gran angular a un lente ultra gran angular: ANDROID_CONTROL_ZOOM_RATIO admite el alejamiento (<1.0f), mientras que ANDROID_SCALER_CROP_REGION no.

A modo de ejemplo, aquí se muestran varias situaciones de diferentes relaciones de zoom, regiones de recorte y transmisiones de salida con la misma cámara hipotética definida en la sección anterior.

Proporción de zoom: 2.0; 1/4 del campo visual original
Región de recorte: (0, 0, 2,000, 1,500) (relación de aspecto 4:3)
Recorte de transmisión de 640 × 480: (0, 0, 2,000, 1500) (igual a la región de recorte)
1,280 × 720, recorte de transmisión (720 × 720)

zoom-ratio-2-crop-43

Figura 5: Zoom 2.0, relación de aspecto 4:3

Relación de zoom: 2.0; 1/4 del campo visual original
Región de recorte: (0, 187, 2000, 1125) (relación de aspecto 16:9)
Recorte de transmisión de 640 × 480: (250, 187, 1500, 1125) (con formato pillarbox)
Recorte de transmisión de 1280 × 720: (0, 187, 2000, 1125) (igual que la región de recorte)

zoom-ratio-2-crop-169

Figura 6: Zoom de 2.0, relación de aspecto de 16:9

Proporción de zoom: 0.5; 4x del campo visual original (se cambió de lente gran angular a lente ultra gran angular)
Región de recorte: (250, 0, 1500, 1500) (relación de aspecto 1:1)
Recorte de transmisión de 640 x 480: (250, 187, 187, 187, 1500, 40x 250, letterbox, 1803) (250, 187, 180, letterbox, 1,125) (250, 1125, letterbox 12:7) (250, 1125, letterbox 12:7) (250, 1500, 1125) (250, 0, 1,500, 1,500)

images/zoom-ratio-0.5-crop-11

Figura 7: Zoom de 0.5, relación de aspecto de 1:1

Como se ve en los gráficos anteriores, el sistema de coordenadas de la región de recorte cambia al campo visual efectivo después del zoom y se representa con un rectángulo con las siguientes dimensiones: (0, 0, activeArrayWith, activeArrayHeight). Lo mismo se aplica a las regiones y caras de AE/AWB/AF. Este cambio en el sistema de coordenadas no se aplica a la captura RAW y sus metadatos relacionados, como intrinsicCalibration y lensShadingMap.

Si se usa el mismo ejemplo hipotético anterior y se supone que la transmisión de salida n° 1 (640 × 480) es la transmisión del visor, se puede lograr un zoom de 2.0x de una de las siguientes maneras:

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

Para que una app establezca android.control.aeRegions como el cuarto superior izquierdo del campo de visión del visor, establece android.control.aeRegions en (0, 0, 1000, 750) con android.control.zoomRatio en 2.0. Como alternativa, la app puede establecer android.control.aeRegions en la región equivalente de (500, 375, 1000, 750) para android.control.zoomRatio de 1.0.