Streams de saída, corte e zoom

Streams de saída

O subsistema da câmera opera exclusivamente no pipeline baseado em ANativeWindow para todas as resoluções e formatos de saída. É possível configurar vários streams uma vez para enviar um único frame para vários destinos, como a GPU, o vídeo codificador, RenderScript: ou buffers visíveis para aplicativos (RAW Bayer, YUV processado ou buffers de codificação JPEG).

Como otimização, esses fluxos de saída precisam ser configurados com antecedência. apenas um número limitado pode existir ao mesmo tempo. Isso permite a pré-alocação de os buffers de memória e a configuração do hardware da câmera, de modo que, quando as solicitações forem enviados com vários pipelines de saída listados, não haverá ou latência no atendimento da solicitação.

Para mais informações sobre as combinações de saída de stream garantido dependem do nível de hardware compatível, consulte createCaptureSession():

Recorte

Recorte da matriz completa de pixels (para zoom digital e outros casos de uso em que uma um campo de visão menor é desejável) é comunicada pelo objeto ANDROID_SCALER_CROP_REGION do ambiente. Essa configuração é individual, e pode ser alterada a cada solicitação. o que é fundamental para implementar um zoom digital suave.

A região é definida como um retângulo (x, y, largura, altura), com (x, y) que descreve o canto superior esquerdo do retângulo. O retângulo é definido no sistema de coordenadas da matriz de pixels ativos do sensor, sendo (0,0) o pixel superior esquerdo da matriz de pixels ativos. Portanto, a largura e a altura não podem ser maior do que as dimensões relatadas em ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY campo de informações estáticas. A largura e a altura mínimas permitidas são informadas pela HAL. pelo campo de informações estáticas ANDROID_SCALER_MAX_DIGITAL_ZOOM, que descreve o fator de zoom máximo aceito. Portanto, a largura mínima da região de corte e altura são:

  {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) }

Se a região de colheita precisar atender a requisitos específicos (por exemplo, para começar em coordenadas uniformes e sua largura/altura precisa ser uniforme), a HAL precisa fazer o arredondamento necessário e gravar a região de corte final usada nas metadados de resultado de saída. Da mesma forma, se a HAL implementar estabilização de vídeo, precisa ajustar a região do corte resultante para descrever a região realmente incluída na saída após a aplicação da estabilização de vídeo. Em geral, uma câmera que usa aplicativo deve ser capaz de determinar o campo de visão que está recebendo com base em a região de corte, as dimensões do sensor de imagem e a distância focal da lente.

Como a região de corte se aplica a todos os fluxos, que podem ter aspectos diferentes proporções do que a região de corte, a região exata do sensor usada para cada fluxo pode ser menor que a região de corte. Especificamente, cada stream deve manter quadrados pixels e a proporção dela recortando o mínimo possível o corte definido na mesma região. Se a proporção do stream for mais larga que a região de corte, o stream deve ser cortada na vertical, e se a proporção do stream for mais estreita que a região de corte, a transmissão deve ser cortada na horizontal.

Em todos os casos, o corte de fluxo precisa estar centralizado na região correspondente. cada stream é cortado na horizontal ou vertical em relação ao tamanho na região de corte, nunca ambas.

Por exemplo, se dois fluxos forem definidos, um de 640 x 480 (aspecto 4:3) e um Stream de 1280x720 (aspecto 16:9). Confira abaixo as regiões de saída esperadas. para cada fluxo para algumas regiões de colheita, em um modelo hipotético de 3 MP (2.000 x matriz de 1500 pixels).

Região de corte: (500, 375, 1.000, 750) (proporção 4:3)
Corte da transmissão de 640 x 480: (500, 375, 1.000, 750) (igual à região de corte)
Corte da transmissão de 1.280 x 720: (500, 469, 1.000, 562)

proporção-de-corte-43

Figura 1. Proporção de 4:3

Região de corte: (500, 375, 1333, 750) (proporção de 16:9)
Corte da transmissão de 640 x 480: (666, 375, 1.000, 750)
Corte em stream de 1.280 x 720: (500, 375, 1.333, 750) (igual à região de corte)

proporção-cortante-169

Figura 2. Proporção de 16:9

Região de corte: (500, 375, 750, 750) (proporção 1:1)
Corte da transmissão de 640 x 480: (500, 469, 750, 562)
Corte da transmissão de 1.280 x 720: (500, 543, 750, 414)

proporção-de-corco-11

Figura 3. Proporção 1:1

Por fim, um exemplo de stream com proporção quadrada de 1024 x 1024, em vez de 480p. stream:
Região de corte: (500, 375, 1.000, 750) (proporção 4:3)
Corte de stream de 1.024 x 1.024: (625, 375, 750, 750)
Corte da transmissão de 1.280 x 720: (500, 469, 1.000, 562)

região-correção-43-proporção-quadrada

Figura 4. proporção 4:3, quadrado

Reprocessamento

O suporte adicional para arquivos de imagem bruta é fornecido pelo suporte de reprocessamento para RAW Bayer dados. Esse suporte permite que o pipeline da câmera processe uma imagem Buffer e metadados RAW (um quadro inteiro que foi gravado anteriormente), para produz uma nova saída YUV ou JPEG renderizada.

Zoom

Para dispositivos com o Android 11 ou mais recente, um app pode usar o zoom da câmera. (digital e óptico) pela configuração ANDROID_CONTROL_ZOOM_RATIO.

A proporção de zoom é definida como um fator de ponto flutuante. Em vez de usando ANDROID_SCALER_CROP_REGION para cortar e aplicar zoom, um app pode usar ANDROID_CONTROL_ZOOM_RATIO para controlar o nível de zoom e use ANDROID_SCALER_CROP_REGION para corte horizontal e vertical de alcançar proporções diferentes do sensor de câmera nativo.

Um sistema com várias câmeras pode conter mais de uma lente distâncias focais, e o usuário pode usar o zoom óptico alternando entre lentes. O uso de ANDROID_CONTROL_ZOOM_RATIO traz benefícios nos cenários abaixo:

  • Aumentar o zoom de uma lente grande angular para telefoto: uma proporção de ponto flutuante oferece melhor precisão em comparação com valores inteiros de ANDROID_SCALER_CROP_REGION:
  • Diminuir o zoom de uma lente grande angular para ultra grande angular: ANDROID_CONTROL_ZOOM_RATIO oferece suporte a redução de zoom (<1.0f), enquanto ANDROID_SCALER_CROP_REGION não.

Para ilustrar, aqui estão vários cenários com diferentes proporções de zoom, regiões de corte e resultados usando a mesma câmera hipotética definida na seção anterior.

Proporção de zoom: 2,0; 1/4 do campo de visão original
Região de corte: (0, 0, 2000, 1500) (proporção 4:3)
Corte da transmissão de 640 x 480: (0, 0, 2.000, 1.500) (igual à região de corte)
Corte da transmissão de 1280 x 720: (0, 187, 2000, 1125)

proporção-zoom-2-crop-43

Figura 5. Zoom de 2,0, proporção de 4:3

Proporção de zoom: 2,0; 1/4 do campo de visão original
Região de corte: (0, 187, 2000, 1125) (proporção de 16:9)
Corte da transmissão de 640 x 480: (250, 187, 1.500, 1.125) (pillarbox)
Corte em stream de 1280 x 720: (0, 187, 2000, 1125) (igual à região de corte)

proporção-zoom-2-crop-169

Figura 6. Zoom de 2,0, proporção de 16:9

Proporção de zoom: 0,5; Campo de visão original: 4x (alterado de lente grande angular para ultra grande angular)
Região de corte: (250, 0, 1500, 1500) (proporção 1:1)
Corte da transmissão de 640 x 480: (250, 187, 1500, 1125) (com efeito letterbox)
Corte da transmissão de 1.280 x 720: (250, 328, 1.500, 844) (com efeito letterbox)

images/zoom-ratio-0.5-crop-11

Figura 7. Zoom de 0,5, proporção de 1:1

Como visto nos gráficos acima, o sistema de coordenadas da região de colheita muda para o valor efetivo campo de visão pós-zoom e é representada pelo retângulo com as seguintes dimensões: (0, 0, activeArrayWith, activeArrayHeight). O mesmo se aplica às regiões e aos rostos de AE/AWB/AF. Essa mudança no sistema de coordenadas não se aplica à Captura RAW e metadados relacionados, como intrinsicCalibration e lensShadingMap.

Usando o mesmo exemplo hipotético acima e supondo que o fluxo de saída no 1 (640x480) seja o stream do visor, o zoom de 2,0x pode ser obtido de duas maneiras:

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

Para que um app defina android.control.aeRegions como o canto superior esquerdo um quarto do campo de visão do visor, android.control.aeRegions a (0, 0, 1000, 750) com O valor android.control.zoomRatio foi definido como 2.0. Como alternativa, o app pode definir android.control.aeRegions como o equivalente região de (500, 375, 1000, 750) para android.control.zoomRatio de 1.0.