Aprenda a usar imagens aumentadas nos seus próprios apps.
Pré-requisitos
Entenda os conceitos fundamentais de RA. e como configurar uma sessão do ARCore antes de continuar.
Criar um banco de dados de imagens
Cada banco de dados de imagens pode armazenar informações de até 1.000 imagens.
Há duas maneiras de criar um
AugmentedImageDatabase
:
- Carregar um banco de dados de imagens salvo. Se quiser, adicione mais imagens de referência.
- Crie um novo banco de dados vazio. Em seguida, adicione uma imagem de referência de cada vez.
Carregar um banco de dados de imagens salvo
Usar AugmentedImageDatabase.deserialize()
para carregar um banco de dados de imagens atual:
Java
AugmentedImageDatabase imageDatabase; try (InputStream inputStream = this.getAssets().open("example.imgdb")) { imageDatabase = AugmentedImageDatabase.deserialize(session, inputStream); } catch (IOException e) { // The Augmented Image database could not be deserialized; handle this error appropriately. }
Kotlin
val imageDatabase = this.assets.open("example.imgdb").use { AugmentedImageDatabase.deserialize(session, it) }
Bancos de dados de imagens podem ser criados usando o arcoreimg
ferramenta de linha de comando durante o desenvolvimento ou chamando
AugmentedImageDatabase.serialize()
em um banco de dados que contém os dados carregados na memória.
Criar um novo banco de dados vazio
Para criar um banco de dados de imagens vazio durante a execução, use o construtor AugmentedImageDatabase
:
Java
AugmentedImageDatabase imageDatabase = new AugmentedImageDatabase(session);
Kotlin
val imageDatabase = AugmentedImageDatabase(session)
Adicionar imagens a um banco de dados
Adicione imagens ao seu banco de dados chamando
AugmentedImageDatabase.addImage()
para cada imagem, especificando um widthInMeters
opcional.
Java
Bitmap bitmap; try (InputStream bitmapString = getAssets().open("dog.jpg")) { bitmap = BitmapFactory.decodeStream(bitmapString); } catch (IOException e) { // The bitmap could not be found in assets; handle this error appropriately. throw new AssertionError("The bitmap could not be found in assets.", e); } // If the physical size of the image is not known, use addImage(String, Bitmap) instead, at the // expense of an increased image detection time. float imageWidthInMeters = 0.10f; // 10 cm int dogIndex = imageDatabase.addImage("dog", bitmap, imageWidthInMeters);
Kotlin
val bitmap = assets.open("dog.jpg").use { BitmapFactory.decodeStream(it) } // If the physical size of the image is not known, use addImage(String, Bitmap) instead, at the // expense of an increased image detection time. val imageWidthInMeters = 0.10f // 10 cm val dogIndex = imageDatabase.addImage("dog", bitmap, imageWidthInMeters)
Os índices retornados podem ser usados posteriormente para identificar qual imagem de referência foi detectado.
Ativar rastreamento de imagens
Configure sua sessão do ARCore para começar a rastrear imagens definindo a sessão para uma configuração com o banco de dados de imagens desejado:
Java
Config config = new Config(session); config.setAugmentedImageDatabase(imageDatabase); session.configure(config);
Kotlin
val config = Config(session) config.augmentedImageDatabase = imageDatabase session.configure(config)
Durante a sessão, o ARCore procura imagens combinando pontos de recurso do imagem da câmera em relação às do banco de dados de imagens.
Para acessar as imagens correspondentes, pesquise AugmentedImage
s atualizados no loop de atualização do frame.
Java
Collection<AugmentedImage> updatedAugmentedImages = frame.getUpdatedTrackables(AugmentedImage.class); for (AugmentedImage img : updatedAugmentedImages) { if (img.getTrackingState() == TrackingState.TRACKING) { // Use getTrackingMethod() to determine whether the image is currently // being tracked by the camera. switch (img.getTrackingMethod()) { case LAST_KNOWN_POSE: // The planar target is currently being tracked based on its last // known pose. break; case FULL_TRACKING: // The planar target is being tracked using the current camera image. break; case NOT_TRACKING: // The planar target isn't been tracked. break; } // You can also check which image this is based on img.getName(). if (img.getIndex() == dogIndex) { // TODO: Render a 3D version of a dog in front of img.getCenterPose(). } else if (img.getIndex() == catIndex) { // TODO: Render a 3D version of a cat in front of img.getCenterPose(). } } }
Kotlin
val updatedAugmentedImages = frame.getUpdatedTrackables(AugmentedImage::class.java) for (img in updatedAugmentedImages) { if (img.trackingState == TrackingState.TRACKING) { // Use getTrackingMethod() to determine whether the image is currently // being tracked by the camera. when (img.trackingMethod) { AugmentedImage.TrackingMethod.LAST_KNOWN_POSE -> { // The planar target is currently being tracked based on its last known pose. } AugmentedImage.TrackingMethod.FULL_TRACKING -> { // The planar target is being tracked using the current camera image. } AugmentedImage.TrackingMethod.NOT_TRACKING -> { // The planar target isn't been tracked. } } // You can also check which image this is based on AugmentedImage.getName(). when (img.index) { dogIndex -> TODO("Render a 3D version of a dog at img.getCenterPose()") catIndex -> TODO("Render a 3D version of a cat at img.getCenterPose()") } } }
Compatibilidade com diferentes casos de uso
Quando o ARCore detecta uma imagem aumentada, ele cria um Trackable
para ela
Imagem aumentada e conjuntos TrackingState
para TRACKING
e TrackingMethod
para FULL_TRACKING
. Quando a imagem rastreada sai da visualização da câmera, o ARCore
muda o TrackingMethod
para LAST_KNOWN_POSE
enquanto continua a fornecer a orientação e a posição do
a imagem.
O app precisa usar essas enumerações de maneira diferente, dependendo do uso pretendido caso.
Imagens fixas. A maioria dos casos de uso envolvendo imagens fixadas no local (ou seja, que não devem ser movidas) podem simplesmente usar
TrackingState
para determinar se a imagem foi detectada e se a localização dela é conhecida.TrackingMethod
pode ser ignorada.Imagens em movimento. Caso seu app precise rastrear uma imagem em movimento, use ambos
TrackingState
eTrackingMethod
para determinar se a imagem foi detectado e se a posição dele é conhecida.
Caso de uso | Imagem fixa | Imagem em movimento |
---|---|---|
Exemplo | Um pôster pendurado em uma parede | Um anúncio na lateral de um ônibus |
A pose pode ser considerados válidos quando |
TrackingState == TRACKING |
TrackingState == TRACKING
e : TrackingMethod == FULL_TRACKING
|
Consulte também
Os exemplos de projetos de imagens aumentadas no SDK do ARCore.