ITS da câmera

Camera Image Test Suite (ITS) é uma estrutura para executar testes em imagens produzidas por uma câmera Android. O objetivo geral de cada teste no ITS é configurar a câmera de uma maneira específica, capturar uma ou mais fotos e examinar as fotos para ver se elas contêm os dados de imagem esperados. Muitos dos testes exigem que a câmera seja apontada para um gráfico de alvo específico ou iluminada com uma intensidade específica.

O ITS está localizado no equipamento de teste do CTS Verifier em cts/apps/CameraITS . Os dispositivos devem passar nos testes ITS correspondentes aos recursos suportados anunciados pela estrutura da câmera para aplicativos de terceiros como um subconjunto do CTS.

Configurar

Para executar testes ITS, o seguinte deve ser configurado:

  • Um dispositivo em teste (DUT)
  • Uma máquina host (por exemplo, um desktop ou laptop Linux)
  • Uma cena que a câmera fotografa

Configuração do dispositivo em teste (DUT)

Para configurar um DUT, siga estas etapas:

  1. Conecte o DUT a uma máquina host via USB.
  2. Conceda permissões para o host acessar o DUT pelo ADB.
  3. Instale o aplicativo CTS Verifier ( CtsVerifier.apk ) no dispositivo. Para obter mais informações, consulte Usando o verificador CTS .

    extract root/out/host/linux-x86/cts-verfier/android-cts-verifier.zip
    cd android-cts-verifier
    adb install -r -g CtsVerifier.apk
    

Configuração do host

O ITS exige que a máquina host esteja conectada ao DUT por meio de USB, seja capaz de usar o ADB para controle e comunicação do dispositivo e tenha o software necessário instalado.

Para configurar sua máquina host, certifique-se de que o software a seguir esteja instalado.

Ferramentas da plataforma Android SDK

As ferramentas da plataforma Android SDK devem estar instaladas e o ADB deve estar no caminho executável do shell ou terminal em execução na máquina host. Para obter a versão pública das ferramentas da plataforma Android SDK, consulte Notas de versão das ferramentas da plataforma SDK .

Pitão

Python deve estar instalado na máquina host. Recomendamos o uso de uma distribuição Python integrada para garantir suporte para versões compatíveis. Para obter detalhes sobre quais versões do Python e do pacote instalar para uma versão específica, consulte as notas de versão do Camera ITS para a versão correspondente.

Mobly

Para Android 12 e superior, a estrutura de teste Mobly deve estar instalada. Mobly permite configurar um DUT e um tablet gráfico na classe its_base_test . Para instalar a estrutura de teste Mobly, execute:

pip install mobly

Configuração do ambiente

Para configurar o ambiente de teste, execute:

cd CameraITS
source build/envsetup.sh

Este comando verifica a instalação do Python, configura a variável de ambiente PYTHONPATH e executa testes de unidade nos módulos utils/*.py . Se nenhum erro for impresso no terminal, o ambiente está pronto para executar os testes ITS.

Se você vir a mensagem de erro libtinfo.so.6: no version information available (required by /bin/sh) no tempo de execução, execute o seguinte comando para renomear o arquivo libtinfo.so.6 .

mv $ENV_DIRECTORY/lib/libtinfo.so.6 $ENV_DIRECTORY/lib/libtinfo.so.6.bak

Configuração de cena

Para configurar as cenas, recomendamos usar a configuração Camera ITS-in-a-box para facilitar a automação, confiabilidade e eficiência nos testes. Os equipamentos de teste ITS-in-a-box suportam todos os requisitos de iluminação, centralização e alteração de gráficos para ITS. Além disso, o ITS-in-a-box é necessário para testes de extensões de câmera .

Para testes manuais, certifique-se do seguinte:

  • O DUT está em um tripé
  • O DUT é apontado para a cena correta para cada teste. (O script de teste ITS fornece avisos para alterar a configuração da cena antes de iniciar os testes em uma nova cena.)
  • O DUT está conectado à máquina host por USB.
  • O DUT não se move durante a execução do teste.
  • A cena é iluminada com uma fonte de luz constante e não flutuante. (Não use luz fluorescente porque isso provoca cintilação.)

O script de teste ITS exibe um prompt solicitando ao usuário que altere a configuração da cena antes de iniciar os testes em uma nova cena.

A orientação do telefone deve ser definida para que a câmera tire imagens sem rotação. A maneira mais fácil de verificar isso é com as cenas de rosto na cena2. A maioria dos telefones tem o telefone na orientação paisagem, com o telefone girado no sentido anti-horário para a câmera traseira e no sentido horário para a câmera frontal.

Arquivos de configuração

Usando a estrutura Mobly, você deve criar um arquivo de configuração config.yml para definir o ambiente de teste do Mobly. A seguir estão exemplos para diferentes casos de uso.

Arquivo config.yml de cenas baseadas em tablet

A seguir está um exemplo de arquivo config.yml para cenas baseadas em tablet. Para testes baseados em tablet, a palavra-chave TABLET deve estar no nome do ambiente de teste. Durante a inicialização, o executor de testes Mobly inicializa os parâmetros no arquivo e os passa para os testes individuais.

TestBeds:
  - Name: TEST_BED_TABLET_SCENES
    # Test configuration for scenes[0:4, 6, _change]
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut
          - serial: 5B16001229
            label: tablet

    TestParams:
      brightness: 192
      chart_distance: 22.0
      debug_mode: "False"  # "True" or "False"; quotes needed
      lighting_cntl: <controller-type>  # "arduino" or "None"; quotes needed
      lighting_ch: <controller-channel>
      camera: 0
      foldable_device: "False". # set "True" if testing foldable
      scene: <scene-name>  # if <scene-name> runs all scenes

Para invocar a plataforma de teste, execute tools/run_all_tests.py . Se não houver valores de linha de comando especificando câmeras ou cenas, o teste será executado com os valores do arquivo config.yml . Se houver valores de linha de comando para câmeras ou cenas, eles substituirão os valores na seção TestParams do arquivo config.yml . Por exemplo:

python tools/run_all_tests.py
python tools/run_all_tests.py camera=1
python tools/run_all_tests.py scenes=2,1,0
python tools/run_all_tests.py camera=1 scenes=2,1,0

arquivo config.yml da cena sensor_fusion

A seguir está um exemplo de arquivo config_yml para testes sensor_fusion . Para testes sensor_fusion , a palavra-chave SENSOR_FUSION deve estar no nome do testbed. O Android 13 e superior suportam apenas o controlador Arduino para fusão de sensores devido à visualização e aos testes de estabilização de vídeo. O Android 12 oferece suporte aos controladores Arduino e Canakit.

Testbeds
  - Name: TEST_BED_SENSOR_FUSION
    # Test configuration for sensor_fusion/test_sensor_fusion.py
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut

    TestParams:
      fps: 30
      img_size: 640,480
      test_length: 7
      debug_mode: "False"
      chart_distance: 25
      rotator_cntl: arduino
      rotator_ch: 1
      camera: 0

Para executar testes sensor_fusion com a caixa de fusão de sensores , execute:

python tools/run_all_tests.py scenes=sensor_fusion
python tools/run_all_tests.py scenes=sensor_fusion camera=0

Arquivo config.yml de vários testbeds

A seguir está um exemplo de arquivo config.yml com vários testbeds, um testbed para tablet e um testbed sensor_fusion . O ambiente de teste correto é determinado pelas cenas testadas.

Testbeds
  - Name: TEST_BED_TABLET_SCENES
    # Test configuration for scenes[0:4, 6, _change]
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut
          - serial: 5B16001229
            label: tablet

    TestParams:
      brightness: 192
      chart_distance: 22.0
      debug_mode: "False"
      chart_loc_arg: ""
      camera: 0
      scene: <scene-name>           # if <scene-name> runs all scenes

  - Name: TEST_BED_SENSOR_FUSION
    # Test configuration for sensor_fusion/test_sensor_fusion.py
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut

    TestParams:
      fps: 30
      img_size: 640,480
      test_length: 7
      debug_mode: "False"
      chart_distance: 25
      rotator_cntl: arduino         # cntl can be arduino or canakit
      rotator_ch: 1
      camera: 0

Arquivo config.yml de teste manual

A seguir está um exemplo de arquivo config.yml para teste manual. A partir do Android 14, o teste manual é compatível com todos os testes, exceto os testes scene_extensions . Para testes manuais, a palavra-chave MANUAL deve estar no nome do testbed. Além disso, a seção AndroidDevice não pode incluir uma seção serial ou de rótulo para um tablet.

TestBeds:
  - Name: TEST_BED_MANUAL
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut

    TestParams:
      debug_mode: "False"
      camera: 0
      scene: 1

Executando testes ITS

Esta seção descreve como executar testes ITS.

Invocando testes

Após a configuração do dispositivo, da máquina host (incluindo o ambiente) e da cena física, execute os testes ITS usando o processo a seguir.

  1. Abra o aplicativo CTS Verifer. No menu de testes, selecione Teste ITS da câmera .

  2. Na máquina host, execute os testes ITS do diretório CameraITS/ . Por exemplo, para um dispositivo com câmeras frontal e traseira, execute o seguinte comando:

    python tools/run_all_tests.py
    

    O script percorre câmeras e cenas de teste com base no arquivo config.yml . Para configurações de depuração, recomendamos executar uma das cenas scene2 com um único teste para obter um retorno mais rápido.

    Para testes manuais, antes de iniciar a execução do conjunto de testes ITS em cada cena, o script tira uma foto da cena atual, salva-a como JPEG, imprime o caminho do JPEG no console e pede ao usuário para confirmar se a imagem está ok. Isso captura e confirma loops de fluxo até que o usuário confirme que a imagem está correta. A seguir estão as mensagens neste fluxo.

    Preparing to run ITS on camera 0
    Start running ITS on camera:  0
    Press Enter after placing camera 0 to frame the test scene:
    scene1_1
    The scene setup should be: A grey card covering at least the   middle 30% of the scene
    Running vendor 3A on device
    Capture an image to check the test scene
    Capturing 1 frame with 1 format [yuv]
    Please check scene setup in /tmp/tmpwBOA7g/0/scene1_1.jpg
    Is the image okay for ITS scene1_1? (Y/N)
    

    Cada execução do script imprime um log mostrando PASS, FAIL ou SKIP para cada teste ITS, onde SKIP indica que o teste foi aprovado porque o dispositivo não anunciou o recurso subjacente que está sendo testado. Por exemplo, se um dispositivo não anunciar por meio das interfaces da câmera que oferece suporte a DNG, os testes relacionados à captura de arquivo DNG serão ignorados e contados como aprovados.

  3. Para confirmar que os testes atenderam aos requisitos do teste, toque no botão de marca de seleção verde. A entrada Camera ITS Test no menu de testes do CTS Verifier fica verde e significa que o telefone passou no Camera ITS.

Teste DUT paralelo

Dispositivos com Android 14 ou superior são compatíveis com testes DUT paralelos. Isso permite testar DUTs em paralelo com vários equipamentos para acelerar os testes gerais. Por exemplo, o teste paralelo permite testar a câmera 0 em um equipamento e a câmera 1 em outro equipamento ao mesmo tempo. Todos os testes para sessões de teste paralelas são agregados na sessão do CTS Verifier no DUT de referência. Você deve executar testes paralelos com o controle de iluminação do Arduino, pois o controle manual de iluminação não é compatível com testes paralelos. Certifique-se de que um canal diferente no mesmo controlador Arduino controle a iluminação de cada equipamento.

A seguir está um exemplo de arquivo config.yml que define três testbeds para execução em paralelo.

TestBeds:
  - Name: TEST_BED_TABLET_SCENES_INDEX_0
    Controllers:
        AndroidDevice:
          - serial: <device-id-0>
            label: dut
          - serial: <tablet-id-0>
            label: tablet
    TestParams:
      brightness: 192
      chart_distance: 22.0
      debug_mode: "False"
      lighting_cntl: "arduino"
      lighting_ch: <controller-channel-0>
      camera: 0
      scene: <scene-name>  # if <scene-name> left as-is runs all scenes
      foldable_device: "False"

  - Name: TEST_BED_TABLET_SCENES_INDEX_1
    Controllers:
        AndroidDevice:
          - serial: <device-id-1>
            label: dut
          - serial: <tablet-id-1>
            label: tablet
    TestParams:
      brightness: 192
      chart_distance: 22.0
      debug_mode: "False"
      lighting_cntl: "arduino"
      lighting_ch: <controller-channel-1>
      camera: 1
      scene: <scene-name>  # if <scene-name> left as-is runs all scenes
      foldable_device: "False"

  # TEST_BED_SENSOR_FUSION represents testbed index 2
  # Parallel sensor_fusion is currently unsupported due to Arduino requirements
  - Name: TEST_BED_SENSOR_FUSION
    # Test configuration for sensor_fusion
    Controllers:
        AndroidDevice:
          - serial: <device-id>
            label: dut
    TestParams:
      fps: 30
      img_size: 640,480
      test_length: 7
      debug_mode: "False"
      chart_distance: 25
      rotator_cntl: "arduino"
      rotator_ch: <controller-channel-2>
      camera: <camera-id>
      foldable_device: "False"
      tablet_device: "False"
      lighting_cntl: "None"
      lighting_ch: <controller-channel>
      scene: "sensor_fusion"

Para executar os testbeds em paralelo, use o seguinte comando:

for i in 0 1 2; do python3 tools/run_all_tests.py testbed_index=$i num_testbeds=3 & done; wait

Modelo de ruído DNG

Os dispositivos que anunciam a capacidade de capturar RAW ou DNG devem fornecer um modelo de ruído nos metadados do resultado da captura de cada imagem bruta. Esse modelo de ruído deve ser incorporado ao HAL da câmera para cada câmera (por exemplo, câmeras frontal e traseira) no dispositivo que reivindica suporte.

Implementação do modelo de ruído

Para implementar um modelo de ruído, siga estas etapas para gerar um modelo de ruído e incorporar o modelo no HAL da câmera.

  1. Para gerar um modelo de ruído para cada câmera, execute o script dng_noise_model.py no diretório tools . Isso gera um trecho de código C. Para obter mais informações sobre como configurar a câmera e o ambiente de captura, consulte o documento DngNoiseModel.pdf no diretório tools .

  2. Para implementar o modelo de ruído para o dispositivo, recorte e cole o trecho de código C no HAL da câmera.

Validação do modelo de ruído

O tests/scene1_1/test_dng_noise_model.py valida o modelo de ruído verificando se os valores de ruído para a exposição e ganho da foto fornecidos nos dados da câmera estão corretos.