Fluxos de saída, corte e zoom

Fluxos de saída

O subsistema da câmera opera somente no pipeline baseado em ANativeWindow para todas as resoluções e formatos de saída. Vários fluxos podem ser configurados ao mesmo tempo para enviar um único quadro para vários destinos, como GPU, codificador de vídeo, RenderScript ou buffers visíveis por aplicativo (RAW Bayer, buffers YUV processados ​​ou buffers codificados em JPEG).

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

Para obter mais informações sobre as combinações de saída de fluxo garantidas que dependem do nível de hardware suportado, consulte createCaptureSession() .

Corte

O recorte da matriz de pixels completo (para zoom digital e outros casos de uso em que um FOV menor é desejável) é comunicado por meio da configuração ANDROID_SCALER_CROP_REGION. Essa é uma configuração por solicitação e pode ser alterada conforme a solicitação, o que é fundamental para implementar o zoom digital suave.

A região é definida como um retângulo (x, y, largura, altura), com (x, y) descrevendo o canto superior esquerdo do retângulo. O retângulo é definido no sistema de coordenadas da matriz de pixels ativos do sensor, com (0,0) sendo o pixel superior esquerdo da matriz de pixels ativos. Portanto, a largura e a altura não podem ser maiores que as dimensões informadas no campo de informações estáticas ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. A largura e a altura mínimas permitidas são relatadas pelo HAL por meio do campo de informações estáticas ANDROID_SCALER_MAX_DIGITAL_ZOOM, que descreve o fator de zoom máximo suportado. Portanto, a largura e a altura mínimas da região de corte 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 corte precisa atender a requisitos específicos (por exemplo, precisa começar em coordenadas pares e sua largura/altura precisa ser uniforme), o HAL deve fazer o arredondamento necessário e escrever a região de corte final usada na saída metadados do resultado. Da mesma forma, se o HAL implementar a estabilização de vídeo, ele deverá ajustar a região de recorte do resultado para descrever a região realmente incluída na saída após a aplicação da estabilização de vídeo. Em geral, um aplicativo de uso de câmera deve ser capaz de determinar o campo de visão que está recebendo com base na região de corte, nas dimensões do sensor de imagem e na distância focal da lente.

Uma vez que a região de cultivo se aplica a todos os fluxos, que podem ter proporções de aspecto diferentes da região de cultivo, a região exata do sensor usada para cada fluxo pode ser menor que a região de cultivo. Especificamente, cada fluxo deve manter pixels quadrados e sua proporção de aspecto cortando minimamente a região de corte definida. Se a proporção do fluxo for mais larga do que a região de corte, o fluxo deverá ser cortado verticalmente e se a proporção do fluxo for mais estreita do que a região de corte, o fluxo deverá ser cortado horizontalmente.

Em todos os casos, o cultivo do riacho deve ser centralizado dentro da região de cultivo completo, e cada riacho é cortado apenas horizontalmente ou verticalmente em relação à região de cultivo completo, nunca ambos.

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

Região de corte: (500, 375, 1000, 750) (proporção 4:3)
Corte de fluxo de 640 x 480: (500, 375, 1000, 750) (igual à região de corte)
Corte de fluxo de 1280 x 720: (500, 469, 1000, 562)

proporção-região-43-cultura

Figura 1. Proporção 4:3

Região de corte: (500, 375, 1333, 750) (proporção 16:9)
Corte de fluxo de 640 x 480: (666, 375, 1000, 750)
Corte de fluxo de 1280 x 720: (500, 375, 1333, 750) (igual à região de corte)

proporção-região-da-cultura-169

Figura 2. Proporção 16:9

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

proporção-região-11-cultura

Figura 3. Proporção 1:1

E um exemplo final, um fluxo de proporção quadrada de 1024x1024 em vez do fluxo de 480p:
Região de corte: (500, 375, 1000, 750) (proporção 4:3)
Corte de fluxo de 1024x1024: (625, 375, 750, 750)
Corte de fluxo de 1280 x 720: (500, 469, 1000, 562)

crop-region-43-square-ratio

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

Reprocessamento

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

Ampliação

Para dispositivos com Android 11 ou superior, um aplicativo pode usar o zoom de uma câmera (digital e óptico) por meio da configuração ANDROID_CONTROL_ZOOM_RATIO .

A taxa de zoom é definida como um fator de ponto flutuante. Em vez de usar ANDROID_SCALER_CROP_REGION para corte e zoom, um aplicativo pode usar ANDROID_CONTROL_ZOOM_RATIO para controlar o nível de zoom e usar ANDROID_SCALER_CROP_REGION para corte horizontal e vertical para obter proporções diferentes do sensor de câmera nativo.

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

  • Zoom de uma lente grande para uma lente telefoto: uma proporção de ponto flutuante fornece melhor precisão em comparação com valores inteiros de ANDROID_SCALER_CROP_REGION .
  • Diminuir o zoom de uma lente grande para uma 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 de diferentes taxas de zoom, regiões de corte e fluxos de saída, usando a mesma câmera hipotética definida na seção anterior.

Taxa 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 de fluxo de 640 x 480: (0, 0, 2000, 1500) (igual à região de corte)
Corte de fluxo de 1280 x 720: (0, 187, 2000, 1125)

zoom-ratio-2-crop-43

Figura 5. Zoom 2.0, proporção 4:3

Taxa de zoom: 2,0; 1/4 do campo de visão original
Região de corte: (0, 187, 2000, 1125) (proporção 16:9)
Corte de fluxo de 640 x 480: (250, 187, 1500, 1125) (com colunas)
Corte de fluxo de 1280 x 720: (0, 187, 2000, 1125) (igual à região de corte)

zoom-ratio-2-crop-169

Figura 6. Zoom 2.0, proporção 16:9

Taxa de zoom: 0,5; 4x do campo de visão original (mudança de lente grande para ultra grande angular)
Região de corte: (250, 0, 1500, 1500) (proporção de 1:1)
Corte de fluxo de 640 x 480: (250, 187, 1500, 1125) (letterboxed)
Corte de fluxo de 1280 x 720: (250, 328, 1500, 844) (letterboxed)

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 corte muda para o campo de visão pós-zoom efetivo e é representado pelo retângulo com as seguintes dimensões: ( 0 , 0 , activeArrayWith , activeArrayHeight ). O mesmo se aplica às regiões e faces AE/AWB/AF. Essa alteração do sistema de coordenadas não se aplica à captura RAW e seus metadados relacionados, como intrinsicCalibration e lensShadingMap .

Usando o mesmo exemplo hipotético acima, e assumindo que o fluxo de saída nº 1 (640x480) é o fluxo 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 aplicativo defina android.control.aeRegions como o quarto superior esquerdo do campo de visão do visor, defina android.control.aeRegions como (0, 0, 1000, 750) com android.control.zoomRatio definido como 2.0 . Como alternativa, o aplicativo pode definir android.control.aeRegions para a região equivalente de (500, 375, 1000, 750) para android.control.zoomRatio de 1.0 .