En esta página, se describe el funcionamiento y la optimización de la cámara, incluidos los flujos de salida, el recorte, el reprocesamiento y el zoom.
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 fotograma a muchos objetivos, como la GPU, el codificador de video, RenderScript o los búferes visibles para la app (Bayer RAW, búferes YUV procesados o búferes codificados en JPEG).
Como optimización, estos flujos de salida se deben configurar con anticipación, y solo puede existir una cantidad limitada 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 se envían solicitudes con varias canalizaciones de salida o con canalizaciones variables, no haya 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 compatible, consulta
createCaptureSession.
Recorte
El recorte del array de píxeles completo (para el zoom digital y otros casos de uso en los que es deseable un FOV más pequeño) se comunica a través del ANDROID_SCALER_CROP_REGION parámetro de configuración. 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, con (0,0) como el
píxel superior izquierdo del array de píxeles activos. Por lo tanto, el ancho y la altura no pueden
ser mayores que las dimensiones informadas en el ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY
campo de información estática. 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 en coordenadas pares y su ancho o altura debe ser par), el HAL debe realizar el redondeo necesario y escribir la región de recorte final que se usa en los metadatos del resultado de salida. Del mismo modo, si el HAL implementa la estabilización de video, debe ajustar la región de recorte del resultado para describir la región que se incluye en la salida después de que se aplica la estabilización de video. En general, una app que usa la cámara debe poder determinar el campo visual que recibe en función de la región de recorte, las dimensiones del sensor de imagen y la longitud focal de la lente.
Dado que la región de recorte se aplica a todos los flujos, que pueden tener diferentes relaciones de aspecto que la región de recorte, la región exacta del sensor que se usa para cada flujo puede ser más pequeña que la región de recorte. En particular, cada flujo 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 del flujo es más ancha que la región de recorte, el flujo se debe recortar verticalmente, y si la relación de aspecto del flujo es más estrecha que la región de recorte, el flujo se debe recortar horizontalmente.
En todos los casos, el recorte del flujo debe centrarse dentro de la región de recorte completa, y cada flujo solo se recorta horizontal o verticalmente en relación con la región de recorte completa, nunca ambos.
Por ejemplo, si se definen dos flujos, un flujo de 640 x 480 (relación de aspecto de 4:3) y un flujo de 1280 x 720 (relación de aspecto de 16:9), a continuación, se muestran las regiones de salida esperadas para cada flujo para algunas regiones de recorte de muestra, en un sensor hipotético de 3 MP (array de píxeles de 2000 x 1500).
Región de recorte: (500, 375, 1000, 750) (relación de aspecto de 4:3)
Recorte de flujo de 640 x 480: (500, 375, 1000, 750) (igual a la región de recorte)
Recorte de flujo de 1280 x 720: (500, 469, 1000, 562)
Figura 1: Relación de aspecto de 4:3
Región de recorte: (500, 375, 1333, 750) (relación de aspecto de 16:9)
Recorte de flujo de 640 x 480: (666, 375, 1000, 750)
Recorte de flujo de 1280 x 720: (500, 375, 1333, 750) (igual a la región de recorte)
Figura 2: Relación de aspecto de 16:9
Región de recorte: (500, 375, 750, 750) (relación de aspecto de 1:1)
Recorte de flujo de 640 x 480: (500, 469, 750, 562)
Recorte de flujo de 1280 x 720: (500, 543, 750, 414)
Figura 3: Relación de aspecto de 1:1
Y un ejemplo final, un flujo de relación de aspecto cuadrada de 1024 x 1024 en lugar del flujo de 480p
stream:
Región de recorte: (500, 375, 1000, 750) (relación de aspecto de 4:3)
Recorte de flujo de 1024 x 1024: (625, 375, 750, 750)
Recorte de flujo de 1280 x 720: (500, 469, 1000, 562)
Figura 4: Relación de aspecto de 4:3, cuadrada
Reprocesamiento
La compatibilidad adicional con archivos de imagen sin procesar se proporciona mediante la compatibilidad con el reprocesamiento de datos Bayer RAW. Esta compatibilidad permite que la canalización de la cámara procese un búfer RAW y metadatos capturados anteriormente (un fotograma completo que se grabó anteriormente) para producir una nueva salida YUV o JPEG renderizada.
Zoom
En el caso de dispositivos que ejecutan Android 11 o versiones posteriores, una app puede usar el zoom de una cámara
(digital y óptico) a través del parámetro de 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 el recorte y el zoom, una app puede usar ANDROID_CONTROL_ZOOM_RATIO para controlar el nivel de zoom y usar ANDROID_SCALER_CROP_REGION para el recorte horizontal y vertical para lograr relaciones de aspecto diferentes del sensor de cámara nativo.
Un sistema de varias cámaras puede contener más de una lente con diferentes distancias focales, y el usuario puede usar el zoom óptico cambiando entre las lentes.
El uso de ANDROID_CONTROL_ZOOM_RATIO tiene beneficios en las siguientes situaciones:
- 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 desde una lente gran angular a una lente ultra gran angular:
ANDROID_CONTROL_ZOOM_RATIOadmite el alejamiento (<1.0f), mientras queANDROID_SCALER_CROP_REGIONno lo hace.
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 de 4:3)
Recorte de flujo de 640 x 480: (0, 0, 2000, 1500) (igual a la región de recorte)
Recorte de flujo de 1280 x 720: (0, 187, 2000, 1125)
Figura 5: Zoom de 2.0, relación de aspecto de 4:3
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 de 16:9)
Recorte de flujo de 640 x 480: (250, 187, 1500, 1125) (con barras laterales)
Recorte de flujo de 1280 x 720: (0, 187, 2000, 1125) (igual a la región de recorte)
Figura 6: Zoom de 2.0, relación de aspecto de 16:9
Relación de zoom: 0.5; 4 veces el 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 de 1:1)
Recorte de flujo de 640 x 480: (250, 187, 1500, 1125) (con barras superiores e inferiores)
Recorte de flujo de 1280 x 720: (250, 328, 1500, 844) (con barras superiores e inferiores)
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 el rectángulo con las siguientes dimensiones: (0, 0, activeArrayWith, activeArrayHeight). Lo mismo se aplica a las regiones AE/AWB/AF y a las caras. Este cambio en el sistema de coordenadas no se aplica a la captura RAW ni a sus metadatos relacionados, como intrinsicCalibration y lensShadingMap.
Con 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 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 establecido 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.