Flujos 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 varios flujos a la vez para enviar un solo cuadro a muchos objetivos, como la GPU, el codificador de video, RenderScript o búferes visibles en aplicaciones (RAW Bayer, búferes YUV procesados o búferes codificados en JPEG).
Como optimización, estos flujos de salida deben configurarse con anticipación y solo puede existir un número limitado a la vez. Esto permite la asignación previa de búferes de memoria y la configuración del hardware de la cámara, de modo que cuando las solicitudes se envían con múltiples o variables canalizaciones de salida enumeradas, no habrá demoras ni latencia en el cumplimiento de la solicitud.
Para obtener más información sobre las combinaciones de salida de transmisión garantizadas que dependen del nivel de hardware admitido, consulte createCaptureSession()
.
recorte
El recorte de la matriz de píxeles completa (para 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. Esta es una configuración por solicitud y puede cambiar según la solicitud, lo cual es fundamental para implementar un zoom digital fluido.
La región se define como un rectángulo (x, y, ancho, alto), con (x, y) describiendo la esquina superior izquierda del rectángulo. El rectángulo se define en el sistema de coordenadas de la matriz de píxeles activa del sensor, siendo (0,0) el píxel superior izquierdo de la matriz de píxeles activa. Por lo tanto, el ancho y la altura no pueden ser mayores que las dimensiones informadas en el campo de información estática ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. HAL informa el ancho y la altura mínimos permitidos a través del campo de información estático 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:
{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 cultivo debe cumplir con requisitos específicos (por ejemplo, debe comenzar en coordenadas pares y su ancho/alto debe ser uniforme), el HAL debe realizar el redondeo necesario y escribir la región de cultivo final utilizada en la salida. metadatos de resultados. De manera similar, si HAL implementa la estabilización de video, debe ajustar la región de recorte de resultados para describir la región realmente incluida en la salida después de aplicar la estabilización de video. En general, una aplicación que usa una cámara debe poder determinar el campo de visión que recibe en función de la región de recorte, las dimensiones del sensor de imagen y la distancia focal de la lente.
Dado que la región de recorte se aplica a todos los flujos, que pueden tener relaciones de aspecto diferentes a las de la región de recorte, la región exacta del sensor utilizada para cada flujo puede ser más pequeña que la región de recorte. Específicamente, cada transmisión debe mantener los píxeles cuadrados y su relación de aspecto recortando mínimamente más 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 debe recortarse más verticalmente, y si la relación de aspecto de la transmisión es más estrecha que la región de recorte, la transmisión debe recortarse más horizontalmente.
En todos los casos, el cultivo de la corriente debe estar centrado dentro de la región de cultivo completa, y cada corriente solo se recorta horizontal o verticalmente en relación con la región de cultivo completa, nunca ambas.
Por ejemplo, si se definen dos transmisiones, una transmisión de 640x480 (aspecto 4:3) y una transmisión de 1280x720 (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 hipotético 3 Sensor MP (matriz de 2000 x 1500 píxeles).
Región de recorte: (500, 375, 1000, 750) (relación de aspecto 4:3)
Recorte de flujo de 640x480: (500, 375, 1000, 750) (igual a la región de recorte)
Recorte de flujo de 1280x720: (500, 469, 1000, 562)
Región de recorte: (500, 375, 1333, 750) (relación de aspecto 16:9)
Recorte de flujo de 640x480: (666, 375, 1000, 750)
Recorte de flujo de 1280x720: (500, 375, 1333, 750) (igual a la región de recorte)
Región de recorte: (500, 375, 750, 750) (relación de aspecto 1:1)
Recorte de flujo de 640x480: (500, 469, 750, 562)
Recorte de flujo de 1280x720: (500, 543, 750, 414)
Y un último ejemplo, una transmisión de relación de aspecto cuadrada de 1024x1024 en lugar de la transmisión de 480p:
Región de recorte: (500, 375, 1000, 750) (relación de aspecto 4:3)
Recorte de flujo de 1024x1024: (625, 375, 750, 750)
Recorte de flujo de 1280x720: (500, 469, 1000, 562)
reprocesamiento
El soporte de reprocesamiento para datos RAW de Bayer proporciona soporte adicional para archivos de imágenes sin procesar. Este soporte permite que la canalización de la cámara procese un búfer RAW y metadatos capturados previamente (un cuadro completo que se grabó previamente), para producir una nueva salida YUV o JPEG renderizada.
Zoom
Para dispositivos con Android 11 o superior, una aplicación puede usar el zoom de una 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 aplicación 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 proporciones de aspecto diferentes a las del sensor de cámara nativo.
Un sistema multicámara puede contener más de una lente con diferentes distancias focales, y el usuario puede usar el zoom óptico cambiando entre lentes. Usar ANDROID_CONTROL_ZOOM_RATIO
tiene beneficios en los siguientes escenarios:
- Acercamiento de una lente gran angular a una lente de teleobjetivo: una relación de punto flotante proporciona una mejor precisión en comparación con los valores enteros de
ANDROID_SCALER_CROP_REGION
. - Alejamiento de una lente ancha a una lente ultra ancha:
ANDROID_CONTROL_ZOOM_RATIO
admite zoom-out (<1.0f) mientras queANDROID_SCALER_CROP_REGION
no.
Relación de zoom: 2,0; 1/4 del campo de visión original
Región de recorte: (0, 0, 2000, 1500) (relación de aspecto 4:3)
Recorte de flujo de 640x480: (0, 0, 2000, 1500) (igual a la región de recorte)
Recorte de flujo de 1280x720: (0, 187, 2000, 1125)
Relación de zoom: 2,0; 1/4 del campo de visión original
Región de recorte: (0, 187, 2000, 1125) (relación de aspecto 16:9)
Recorte de flujo de 640x480: (250, 187, 1500, 1125) (columnado)
Recorte de flujo de 1280x720: (0, 187, 2000, 1125) (igual a la región de recorte)
Relación de zoom: 0,5; 4x del campo de visión original (cambiado de lente ancha a lente ultra ancha)
Región de recorte: (250, 0, 1500, 1500) (relación de aspecto 1:1)
Recorte de flujo de 640x480: (250, 187, 1500, 1125) (en formato letterbox)
Recorte de flujo de 1280x720: (250, 328, 1500, 844) (en formato letterbox)
Como se ve en los gráficos anteriores, el sistema de coordenadas de la región de recorte cambia al campo de visión posterior al zoom efectivo y se representa mediante el rectángulo con las siguientes dimensiones: ( 0
, 0
, activeArrayWith
, activeArrayHeight
). Lo mismo se aplica a las regiones y caras 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
.
Utilizando el mismo ejemplo hipotético anterior, y suponiendo que el flujo de salida n.º 1 (640x480) es el flujo del visor, se puede lograr un zoom de 2,0x de una de dos maneras:
-
zoomRatio = 2.0
,scaler.cropRegion = (0, 0, 2000, 1500)
-
zoomRatio = 1.0
(predeterminado),scaler.cropRegion = (500, 375, 1000, 750)
Para que una aplicación configure android.control.aeRegions
como el cuarto superior izquierdo del campo de visión del visor, configure android.control.aeRegions
en (0, 0, 1000, 750)
con android.control.zoomRatio
configurado en 2.0
. Como alternativa, la aplicación puede establecer android.control.aeRegions
en la región equivalente de (500, 375, 1000, 750)
para android.control.zoomRatio
de 1.0
.