Usar a profundidade bruta no app Android AR Foundation

A API Raw Depth fornece dados de profundidade para uma imagem de câmera com maior precisão do que os dados completos dessa API, mas nem sempre cobre todos os pixels. As imagens de profundidade brutas, junto com as imagens de confiança correspondentes, também podem ser processadas, permitindo que os apps usem apenas os dados de profundidade com precisão suficiente para o caso de uso individual.

Compatibilidade do dispositivo

A profundidade bruta está disponível em todos os dispositivos compatíveis com a API Depth. A API Raw Depth, assim como a API Depth completa, não exige um sensor de profundidade de hardware compatível, como um sensor de tempo de voo (ToF). No entanto, a API Raw Depth e a API Depth completa usam todos os sensores de hardware compatíveis que um dispositivo pode ter.

API Depth bruta x API Depth completa

A API Raw Depth fornece estimativas de profundidade com maior precisão, mas as imagens de profundidade brutas podem não incluir estimativas de profundidade para todos os pixels na imagem da câmera. Por outro lado, a API Depth completa fornece a profundidade estimada para cada pixel, mas os dados de profundidade por pixel podem ser menos precisos devido à suavização e interpolação de estimativas de profundidade. O formato e o tamanho das imagens de profundidade são os mesmos nas duas APIs. Apenas o conteúdo é diferente.

A tabela a seguir ilustra as diferenças entre a API Raw Depth e a API Depth completa usando uma imagem de uma cadeira e uma mesa em uma cozinha.

API Retorna Imagem da câmera Profundidade da imagem Imagem de confiança
API Raw Depth
  • Uma imagem de profundidade bruta que contém uma estimativa de profundidade muito precisa para alguns, mas não todos, os pixels na imagem da câmera.
  • Uma imagem de confiança que proporciona a confiança para cada pixel de imagem com profundidade bruta. Os pixels da imagem da câmera que não têm uma estimativa de profundidade têm uma confiança de zero.
API Full Depth
  • Uma única imagem de profundidade "suavizada" que contém uma estimativa de profundidade para cada pixel.
  • Nenhuma imagem de confiança é fornecida com essa API.
N/A

Imagens de confiança

Nas imagens de confiança retornadas pela API Raw Depth, os pixels mais claros têm valores de confiança mais altos, com pixels brancos representando confiança total e pixels pretos representando nenhuma confiança. Em geral, as regiões na imagem da câmera que têm mais textura, como uma árvore, terão maior confiança de profundidade bruta do que regiões que não têm, como uma parede em branco. Superfícies sem textura geralmente produzem uma confiança de zero.

Se o dispositivo de destino tiver um sensor de profundidade de hardware compatível, a confiança em áreas da imagem próximas o suficiente à câmera provavelmente será maior, mesmo em superfícies sem textura.

Custo do Compute

O custo de computação da API Raw Depth é aproximadamente metade do custo de computação da API Depth completa.

Casos de uso

Com a API Raw Depth, você pode receber imagens de profundidade que fornecem uma representação mais detalhada da geometria dos objetos na cena. Os dados de profundidade brutos podem ser úteis ao criar experiências de RA em que é necessário aumentar a precisão e os detalhes de profundidade para tarefas de compreensão geométrica. Estes são alguns exemplos de casos de uso:

  • Reconstrução 3D
  • Medição
  • Detecção de formas

Pré-requisitos

Entenda os conceitos básicos de RA e como configurar uma sessão do ARCore antes de continuar.

Ativar a profundidade

Em uma nova sessão do ARCore, verifique se o dispositivo de um usuário oferece suporte à profundidade. Nem todos os dispositivos compatíveis com o ARCore oferecem suporte à API Depth devido a restrições de capacidade de processamento. Para economizar recursos, a profundidade é desativada por padrão no ARCore. Ative o modo de profundidade para que o app use a API Depth.

var occlusionManager = // Typically acquired from the Camera game object.

// Check whether the user's device supports the Depth API.
if (occlusionManager.descriptor?.supportsEnvironmentDepthImage)
{
    // If depth mode is available on the user's device, perform
    // the steps you want here.
}

Adquirir a imagem de profundidade bruta mais recente

Chame AROcclusionManager.TryAcquireEnvironmentDepthCpuImage() e use AROcclusionManager.environmentDepthTemporalSmoothingRequested para conseguir a imagem de profundidade bruta mais recente na CPU.

Adquirir a imagem de confiança de profundidade bruta mais recente

Chame AROcclusionManager.TryAcquireEnvironmentDepthConfidenceCpuImage() e use AROcclusionManager.environmentDepthTemporalSmoothingRequested para adquirir a imagem de confiança na CPU.

// Attempt to get the latest environment depth image.
if (occlusionManager && occlusionManager.TryAcquireEnvironmentDepthConfidenceCpuImage(out XRCpuImage image))
{
    using (image)
    {
        UpdateRawImage(m_RawEnvironmentDepthConfidenceImage, image);
    }
}
else
{
    m_RawEnvironmentDepthConfidenceImage.enabled = false;
}