Aprenda a usar imagens aumentadas nos seus apps.
Pré-requisitos
Entenda os conceitos básicos de RA e como configurar uma sessão do ARCore antes de continuar.
Criar um banco de dados de imagens
Crie um ArAugmentedImageDatabase
para armazenar imagens de referência. Há duas formas:
- Criar um banco de dados vazio
ArAugmentedImageDatabase* ar_augmented_image_database = NULL; ArAugmentedImageDatabase_create(ar_session, &ar_augmented_image_database);
- Ler de um arquivo de banco de dados de imagens. Consulte o app de exemplo C AugmentedImage para saber mais sobre
util::LoadFileFromAssetManager
.
std::string database_buffer; util::LoadFileFromAssetManager(asset_manager_, "sample_database.imgdb", &database_buffer); uint8_t* raw_buffer = reinterpret_cast<uint8_t*>(&database_buffer.front()); ArAugmentedImageDatabase* ar_augmented_image_database = NULL; const ArStatus status = ArAugmentedImageDatabase_deserialize( ar_session, raw_buffer, database_buffer.size(), &ar_augmented_image_database);
Os arquivos de banco de dados podem ser criados com a ferramenta de imagem ou chamando ArAugmentedImageDatabase_serialize()
.
Adicionar imagens ao banco de dados
Esta etapa é opcional se as imagens de referência desejadas já tiverem sido carregadas do arquivo de banco de dados. Para adicionar uma imagem no momento da execução, chame ArAugmentedImageDatabase_addImage()
, conforme mostrado abaixo. Consulte o app de exemplo augmented_image_c para conferir funções no namespace util
.
int32_t width, height, stride, index; uint8_t* image_pixel_buffer = nullptr; constexpr const char kSampleImageName[] = "default.jpg"; bool load_image_result = util::LoadImageFromAssetManager( kSampleImageName, &width, &height, &stride, &image_pixel_buffer); uint8_t* grayscale_buffer = nullptr; util::ConvertRgbaToGrayscale(image_pixel_buffer, width, height, stride, &grayscale_buffer); int32_t grayscale_stride = stride / 4; const ArStatus status = ArAugmentedImageDatabase_addImage( ar_session_, ar_augmented_image_database, kSampleImageName, grayscale_buffer, width, height, grayscale_stride, &index); // If the physical size of the image is known, you can instead use // ArStatus ArAugmentedImageDatabase_addImageWithPhysicalSize // This will improve the initial detection speed. ARCore will still actively // estimate the physical size of the image as it is viewed from multiple // viewpoints. delete[] image_pixel_buffer; delete[] grayscale_buffer;
Os valores index
e name
são usados mais tarde para identificar qual imagem de referência foi detectada.
Ativar o rastreamento de imagens
Configure sua sessão do ARCore para rastrear imagens registrando o banco de dados de imagens:
ArConfig_setAugmentedImageDatabase(ar_session_, ar_config, ar_augmented_image_database); const ArStatus status = ArSession_configure(ar_session_, ar_config);
Durante a sessão, o ARCore usa pontos de características da imagem da câmera para corresponder aos do banco de dados de imagens.
Encontrar imagens aumentadas em uma sessão de RA
Para receber as imagens correspondentes, consulte ArAugmentedImage
s atualizados no loop de atualização de frames.
// Update loop, in onDrawFrame ArTrackableList* updated_image_list = nullptr; ArTrackableList_create(ar_session_, &updated_image_list); ArFrame_getUpdatedTrackables( ar_session_, ar_frame_, AR_TRACKABLE_AUGMENTED_IMAGE, updated_image_list); int32_t image_list_size; ArTrackableList_getSize(ar_session_, updated_image_list, &image_list_size); for (int i = 0; i < image_list_size; ++i) { ArTrackable* ar_trackable = nullptr; ArTrackableList_acquireItem(ar_session_, updated_image_list, i, &ar_trackable); ArAugmentedImage* image = ArAsAugmentedImage(ar_trackable); ArTrackingState tracking_state; ArTrackable_getTrackingState(ar_session_, ar_trackable, &tracking_state); int image_index; ArAugmentedImage_getIndex(ar_session_, image, &image_index); if (tracking_state == AR_TRACKING_STATE_TRACKING) { util::ScopedArPose scopedArPose(ar_session_); ArAugmentedImage_getCenterPose(ar_session_, image, scopedArPose.GetArPose()); ArAnchor* image_anchor = nullptr; const ArStatus status = ArTrackable_acquireNewAnchor( ar_session_, ar_trackable, scopedArPose.GetArPose(), &image_anchor); // For example, you can now render content at the image anchor, choosing // content based on the image index (or name). } }
Suporte a diferentes casos de uso
Quando o ARCore detecta uma imagem aumentada, ele cria um Trackable
para essa
imagem e define ArTrackingState
como TRACKING
e ArAugmentedImageTrackingMethod
como FULL_TRACKING
. Quando a imagem rastreada
sai da visualização da câmera, o ARCore continua definindo
ArTrackingState
como TRACKING
,
mas muda o ArAugmentedImageTrackingMethod
para LAST_KNOWN_POSE
, continuando a fornecer a orientação e a posição da
imagem.
O app precisa usar o estado e o método de rastreamento de maneira diferente, dependendo do caso de uso previsto.
Imagens fixas. A maioria dos casos de uso que envolvem imagens fixadas no lugar (ou seja, que não devem se mover) pode simplesmente usar
ArTrackingState
para determinar se a imagem foi detectada e se o local dela é conhecido.ArAugmentedImageTrackingMethod
pode ser ignorado.Mover imagens. Se o app precisar rastrear uma imagem em movimento, use
ArTrackingState
eArAugmentedImageTrackingMethod
para determinar se a imagem foi detectada e se a posição dela é conhecida.
Caso de uso | Imagem fixa | Imagem em movimento |
---|---|---|
Exemplo | Um cartaz pendurado na parede | Um anúncio na lateral de um ônibus |
A pose pode ser considerada válida quando |
ArTrackingState == TRACKING |
ArTrackingState == TRACKING
e ArAugmentedImageTrackingMethod == FULL_TRACKING
|