Flujos de salida
El subsistema de 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 cuadro a muchos objetivos, como la GPU, el codificador de video, RenderScript o búferes visibles para 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 preasignación de búferes de memoria y la configuración del hardware de la cámara, de modo que cuando las solicitudes se envíen con múltiples o diferentes 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 flujo garantizadas que dependen del nivel de hardware admitido, consulte createCaptureSession()
.
Recortar
El recorte de la matriz de píxeles completa (para zoom digital y otros casos de uso en los que es deseable un campo de visión 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), donde (x, y) describe la esquina superior izquierda del rectángulo. El rectángulo se define en el sistema de coordenadas de la matriz de píxeles activos del sensor, siendo (0,0) el píxel superior izquierdo de la matriz de píxeles activos. Por lo tanto, el ancho y el alto 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 alto 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 alto mínimos de la región de cultivo 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 necesita cumplir 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 estabilización de video, debe ajustar la región de recorte del resultado 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 utiliza 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 cultivo se aplica a todas las secuencias, que pueden tener relaciones de aspecto diferentes a las de la región de cultivo, la región exacta del sensor utilizada para cada secuencia puede ser más pequeña que la región de cultivo. Específicamente, cada secuencia debe mantener los 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 corriente es más ancha que la región de cultivo, la corriente se debe recortar aún más verticalmente, y si la relación de aspecto de la corriente es más estrecha que la región de cultivo, la corriente se debe recortar aún más horizontalmente.
En todos los casos, el cultivo del arroyo debe estar centrado dentro de la región de cultivo completa, y cada arroyo solo se cultiva horizontal o verticalmente en relación con la región de cultivo completa, nunca ambas.
Por ejemplo, si se definen dos flujos, un flujo de 640x480 (aspecto 4:3) y un flujo de 1280x720 (aspecto 16:9), a continuación se muestran las regiones de salida esperadas para cada flujo para algunas regiones de cultivos de muestra, en un escenario hipotético de 3 Sensor MP (matriz de 2000 x 1500 píxeles).
Región de cultivo: (500, 375, 1000, 750) (relación de aspecto 4:3)
Cultivo continuo de 640x480: (500, 375, 1000, 750) (igual a la región de cultivo)
Recorte continuo de 1280x720: (500, 469, 1000, 562)
Región de cultivo: (500, 375, 1333, 750) (relación de aspecto 16:9)
Recorte continuo de 640x480: (666, 375, 1000, 750)
Cultivo continuo de 1280x720: (500, 375, 1333, 750) (igual a la región de cultivo)
Región de recorte: (500, 375, 750, 750) (relación de aspecto 1:1)
Recorte continuo de 640x480: (500, 469, 750, 562)
Recorte continuo de 1280x720: (500, 543, 750, 414)
Y un ejemplo final, una transmisión con una relación de aspecto cuadrada de 1024x1024 en lugar de una transmisión de 480p:
Región de cultivo: (500, 375, 1000, 750) (relación de aspecto 4:3)
Recorte de flujo de 1024x1024: (625, 375, 750, 750)
Recorte continuo de 1280x720: (500, 469, 1000, 562)
reprocesamiento
Se proporciona soporte adicional para archivos de imágenes sin procesar mediante el soporte de reprocesamiento de datos RAW de Bayer. Este soporte permite que la canalización de la cámara procese un búfer RAW y metadatos previamente capturados (un fotograma 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 óptica) a través de la configuración ANDROID_CONTROL_ZOOM_RATIO
.
La relación de zoom se define como un factor de coma flotante. En lugar de usar ANDROID_SCALER_CROP_REGION
para recortar y hacer zoom, 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 relaciones de aspecto diferentes a las del sensor nativo de la cámara.
Un sistema multicámara puede contener más de una lente con diferentes distancias focales y el usuario puede utilizar el zoom óptico cambiando entre lentes. Usar ANDROID_CONTROL_ZOOM_RATIO
tiene beneficios en los siguientes escenarios:
- Acercar desde una lente gran angular a una lente teleobjetivo: una relación de punto flotante proporciona una mejor precisión en comparación con los valores enteros de
ANDROID_SCALER_CROP_REGION
. - Alejar de una lente gran angular a una lente ultra gran angular:
ANDROID_CONTROL_ZOOM_RATIO
admite alejamiento (<1.0f) mientras queANDROID_SCALER_CROP_REGION
no lo hace.
Relación de zoom: 2,0; 1/4 del campo de visión original
Región de cultivo: (0, 0, 2000, 1500) (relación de aspecto 4:3)
Cultivo continuo de 640x480: (0, 0, 2000, 1500) (igual a la región de cultivo)
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 cultivo: (0, 187, 2000, 1125) (relación de aspecto 16:9)
Recorte continuo de 640x480: (250, 187, 1500, 1125) (con pilares)
Cultivo continuo de 1280x720: (0, 187, 2000, 1125) (igual a la región de cultivo)
Relación de zoom: 0,5; 4x del campo de visión original (cambiado de lente gran angular a lente ultra gran angular)
Región de recorte: (250, 0, 1500, 1500) (relación de aspecto 1:1)
Recorte continuo de 640x480: (250, 187, 1500, 1125) (buzón)
Recorte continuo de 1280x720: (250, 328, 1500, 844) (buzón)
Como se ve en los gráficos anteriores, el sistema de coordenadas de la región de recorte cambia al campo de visión efectivo después del zoom y está representado por 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 del 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 (640 x 480) es el flujo del visor, se puede lograr un zoom de 2,0x 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 configurar android.control.aeRegions
en la región equivalente de (500, 375, 1000, 750)
para android.control.zoomRatio
de 1.0
.