O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Fluxos de saída, recorte e zoom

Fluxos de saída

O subsistema de câmera opera exclusivamente no pipeline baseado em ANativeWindow para todas as resoluções e formatos de saída. Vários fluxos pode ser configurado de uma só vez para enviar uma única estrutura para muitos objectivos, tais como o da GPU, o codificador vídeo, Renderscript , ou tampões app-visível (RAW Bayer, tampões YUV processados, tampões ou JPEG-codificados).

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 vez. Isso permite a pré-alocação de buffers de memória e a configuração do hardware da câmera, de modo que, quando as solicitações forem enviadas com vários ou vários canais de saída listados, não haverá atrasos ou latência no atendimento da solicitação.

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

Recorte

O corte de toda a matriz de pixels (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 mudar de acordo com a solicitação, o que é fundamental para a implementação de 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 ativa do sensor, com (0,0) sendo o pixel superior esquerdo da matriz de pixels ativa. Portanto, a largura e a altura não podem ser maiores do 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 cumprir requisitos específicos (por exemplo, ela 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 de resultado. Da mesma forma, se o HAL implementa estabilização de vídeo, ele deve ajustar a região de recorte resultante para descrever a região realmente incluída na saída após a estabilização de vídeo ser aplicada. Em geral, um aplicativo que usa uma câmera deve ser capaz de determinar o campo de visão que está recebendo com base na região de recorte, as dimensões do sensor de imagem e o comprimento focal da lente.

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

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

Por exemplo, se dois fluxos são definidos, um fluxo de 640x480 (aspecto 4: 3) e um fluxo de 1280x720 (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 recorte: (500, 375, 1000, 750) (proporção de 4: 3)
Recorte de riacho 640x480: (500, 375, 1000, 750) (igual à região de recorte)
Recorte de riacho de 1280 x 720: (500, 469, 1000, 562)

proporção da região de cultivo 43

Figura 1. 4: 3 proporção

Região de recorte: (500, 375, 1333, 750) (proporção de 16: 9)
Recorte de riacho 640x480: (666, 375, 1000, 750)
Colheita de riacho 1280x720: (500, 375, 1333, 750) (igual à região de cultura)

proporção da região de cultivo 169

Figura 2. 16: 9 relação de aspecto

Região de recorte: (500, 375, 750, 750) (proporção de 1: 1)
Recorte de riacho 640x480: (500, 469, 750, 562)
Colheita de riacho 1280x720: (500, 543, 750, 414)

proporção da região de cultivo 11

Figura 3. 1: 1 razão de aspecto

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

proporção da região de cultivo 43 quadrada

Figura 4. 4: 3 razão de aspecto, 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 previamente capturado e metadados (um quadro inteiro que foi gravado anteriormente), para produzir uma nova saída YUV ou JPEG renderizada.

Ampliação

Para dispositivos que executam o Android 11 ou superior, um aplicativo pode usar o zoom de uma câmera (digital e óptico) através do ANDROID_CONTROL_ZOOM_RATIO configuração.

A taxa de zoom é definida como um fator de ponto flutuante. Em vez de usar ANDROID_SCALER_CROP_REGION para colheita e zoom, uma aplicação pode utilizar ANDROID_CONTROL_ZOOM_RATIO para controlar o nível de zoom, e uso ANDROID_SCALER_CROP_REGION , para o corte horizontal e vertical para conseguir relações de aspecto diferentes do que o sensor da câmara nativa.

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. Usando ANDROID_CONTROL_ZOOM_RATIO tem benefícios nos cenários abaixo:

  • Aumentar Ainda a partir de uma vasta da lente para uma lente de teleobjectiva: Uma razão de ponto flutuante proporciona uma precisão melhor em comparação com os valores de número inteiro de ANDROID_SCALER_CROP_REGION .
  • Zoom out de uma grande lente de uma lente ultrawide: ANDROID_CONTROL_ZOOM_RATIO suporta zoom-out (<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 recorte: (0, 0, 2000, 1500) (proporção de 4: 3)
Recorte de riacho 640x480: (0, 0, 2000, 1500) (igual à região de recorte)
Colheita de riacho 1280x720: (0, 187, 2000, 1125)

zoom-ratio-2-crop-43

Figura 5. 2.0 zoom, proporção de 4: 3 aspecto

Taxa de zoom: 2,0; 1/4 do campo de visão original
Região de recorte: (0, 187, 2000, 1125) (proporção de 16: 9)
Recorte de riacho 640x480: (250, 187, 1500, 1125) (caixa de colunas)
Colheita de riacho 1280x720: (0, 187, 2000, 1125) (igual à região de recorte)

zoom-ratio-2-crop-169

Figura 6. 2.0 zoom, 16: 9

Taxa de zoom: 0,5; 4x do campo de visão original (trocada de lente grande angular para lente ultra-ampla)
Região recortada: (250, 0, 1500, 1500) (proporção de 1: 1)
Recorte de riacho 640x480: (250, 187, 1500, 1125) (caixa de correio)
Recorte de riacho de 1280 x 720: (250, 328, 1500, 844) (caixa de correio)

imagens / proporção de zoom-0,5-corte-11

Figura 7. 0.5 de zoom, 1: 1 razão de aspecto

Como pode ser visto a partir dos gráficos acima, o sistema da região colheita alterações no campo eficaz pós-zoom de vista de coordenadas, e está representada por um rectângulo com as dimensões seguintes: ( 0 , 0 , activeArrayWith , activeArrayHeight ). O mesmo se aplica às regiões e rostos AE / AWB / AF. Esta mudança do sistema de coordenadas não se aplica a captura RAW e seus metadados relacionados, tais como intrinsicCalibration e lensShadingMap .

Usando o mesmo exemplo hipotético acima, e assumindo que o fluxo de saída # 1 (640x480) seja o fluxo do visor, o zoom 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 uma aplicação definir android.control.aeRegions ser o quarto superior esquerdo do campo de visão do visor, definido android.control.aeRegions para (0, 0, 1000, 750) com android.control.zoomRatio conjunto para 2.0 . Alternativamente, a aplicação pode definir android.control.aeRegions para a região equivalente de (500, 375, 1000, 750) para android.control.zoomRatio de 1.0 .