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 en todas las resoluciones y formatos de salida. Se pueden configurar varias transmisiones una vez para enviar un solo fotograma a muchos destinos, como la GPU, la codificador, RenderScript. o los búferes visibles para la aplicación (RAW Bayer, o búferes con codificación JPEG).

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

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

Recortes

Recorte de la matriz de píxeles completa (para el zoom digital y otros casos de uso en los que un un FOV más pequeño (deseable) se comunica a través del ANDROID_SCALER_CROP_REGION del lugar. Esta es una configuración por solicitud y puede cambiar en cada 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 de coordenadas del conjunto de píxeles activos del sensor, donde (0,0) es el valor píxel superior izquierdo del array de píxeles activos. Por lo tanto, el ancho y la altura no pueden sea superior a las dimensiones informadas en el archivo ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY campo de información estática. La 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 mínimo de la región de recorte y altura son las 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 cultivo debe cumplir con requisitos específicos (por ejemplo, para comenzar en coordenadas pares y que su ancho/altura deben ser uniformes), la HAL debes hacer el redondeo necesario y escribir la región final de cultivo usada en el metadatos de resultados de salida. De forma similar, si la HAL implementa la estabilización de video, debes ajustar la región de recorte resultante para describir la región que realmente se incluye en el resultado después de aplicar la estabilización de video. En general, una cámara con una cámara la app debe poder determinar el campo visual que recibe según la región de recorte, las dimensiones del sensor de imagen y la longitud focal del lente.

Dado que la región de recorte se aplica a todas las transmisiones, que pueden tener un aspecto diferente relaciones de aspecto que la región de cultivo, la región exacta del sensor que se usa para cada transmisión puede ser más pequeña que la región de cultivo. Específicamente, cada transmisión debe ser cuadrada de píxeles y su relación de aspecto mediante un recorte mínimo del recorte definido región. Si la relación de aspecto de la transmisión es más ancha que la región de recorte, la transmisión deben recortarse verticalmente y si la relación de aspecto de la transmisión es más estrecha que la región del cultivo, la corriente debería recortarse aún más horizontalmente.

En todos los casos, el recorte de flujo debe estar centrado en la región de recorte completa. cada transmisión solo se recorta de forma horizontal o vertical con respecto al región de cultivo, nunca ambas.

Por ejemplo, si se definen dos transmisiones, una de 640 × 480 (aspecto 4:3) y una La transmisión de 1280 x 720 (aspecto 16:9); a continuación, se muestran las regiones de salida esperadas para cada transmisión en algunas regiones de cultivo de muestra, en un formato de 1,500 píxeles).

Región de recorte: (500, 375, 1,000, 750) (relación de aspecto 4:3)
Recorte de flujo de 640 x 480: (500, 375, 1,000, 750) (igual a la región de recorte)
Recorte de flujo de 1280 x 720: (500, 469, 1000, 562)

Proporción de cultivos entre 43 y 43 regiones

Figura 1: Proporción de 4:3

Región de recorte: (500, 375, 1333, 750) (relación de aspecto de 16:9)
Recorte de flujo de 640 × 480: (666, 375, 1000, 750)
Recorte de flujo de 1280 x 720: (500, 375, 1333, 750) (igual a la región de recorte)

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 flujo de 640 × 480: (500, 469, 750, 562)
Recorte de flujo de 1280 x 720: (500, 543, 750, 414)

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

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

Por último, una transmisión con una relación de aspecto cuadrada de 1024 x 1024 novedades:
Región de recorte: (500, 375, 1,000, 750) (relación de aspecto 4:3)
Recorte de flujo de 1024 x 1024: (625, 375, 750, 750)
Recorte de flujo de 1280 x 720: (500, 469, 1000, 562)

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

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

Reprocesamiento

La compatibilidad con el reprocesamiento de RAW Bayer proporciona compatibilidad adicional con archivos de imagen sin procesar. de datos no estructurados. Esta compatibilidad permite que la canalización de la cámara procese un el búfer y los metadatos RAW (un fotograma completo que se grabó previamente) para para producir una nueva salida renderizada en 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 proporción de zoom se define como un factor de punto flotante. En lugar de usando ANDROID_SCALER_CROP_REGION para recortar y hacer zoom, una app puede usar ANDROID_CONTROL_ZOOM_RATIO para controlar el nivel de zoom y usar ANDROID_SCALER_CROP_REGION para recortes horizontales y verticales a lograr relaciones de aspecto distintas a las del sensor nativo de la cámara.

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 al cambiar de lentes. Usar ANDROID_CONTROL_ZOOM_RATIO tiene beneficios en las siguientes situaciones:

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

A modo de ejemplo, aquí hay varias situaciones con diferentes relaciones de zoom, regiones de recorte y resultados 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, 2000, 1500) (relación de aspecto 4:3)
Recorte de flujo de 640 x 480: (0, 0, 2,000, 1,500) (igual a la región de recorte)
Recorte de flujo de 1280 x 720: (0, 187, 2000, 1125)

relación-de-zoom-2-recorte-43

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

Proporción de zoom: 2.0. 1/4 del campo visual 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) (pillarbox)
Recorte de flujo de 1280 x 720: (0, 187, 2000, 1125) (igual a la región de recorte)

relación-de-zoom-2-recorte-169

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

Proporción de zoom: 0.5; Campo visual original de 4x (se cambió de la lente gran angular a la ultra gran angular)
Región de recorte: (250, 0, 1500, 1500) (relación de aspecto 1:1)
Recorte de flujo de 640 x 480: (250, 187, 1500, 1125) (formato letterbox)
Recorte de flujo de 1280 x 720: (250, 328, 1500, 844) (formato letterbox)

images/zoom-ratio-0.5-crop-11

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

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

Si usamos el mismo ejemplo hipotético anterior y suponiendo que el flujo de salida n.o 1 (640 x 480), es la transmisión en el visor, el zoom de 2.0x se puede lograr 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 app configure android.control.aeRegions como la parte superior izquierda cuarto del campo visual del visor, establecer android.control.aeRegions a (0, 0, 1000, 750) con android.control.zoomRatio se estableció en 2.0. Por otro lado, la app puede establecer android.control.aeRegions como el equivalente región de (500, 375, 1000, 750) para android.control.zoomRatio de 1.0.