Comprendere l'ambiente dell'utente su Android NDK (C)

Scopri come utilizzare l'API Scene Semantics nelle tue app.

L'API Scene Semantics consente agli sviluppatori di comprendere la scena circostante l'utente, fornendo informazioni semantiche in tempo reale basate su modello ML. Data l'immagine di una scena all'aperto, l'API restituisce un'etichetta per ogni pixel in una serie di utili classi semantiche, come cielo, edificio, albero, strada, marciapiede, veicolo, persona e altro ancora. Oltre alle etichette dei pixel, l'API Scene Semantics offre anche valori di confidenza per ogni etichetta del pixel e un modo semplice per eseguire query sulla prevalenza di una determinata etichetta in una scena all'aperto.

Da sinistra a destra, esempi di un'immagine di input, l'immagine semantica delle etichette dei pixel e l'immagine di confidenza corrispondente:

Esempio di immagine di input, immagine semantica e immagine di confidenza semantica.

Prerequisiti

Assicurati di comprendere i concetti fondamentali della realtà aumentata e su come configurare una sessione ARCore prima di procedere.

Attiva la semantica della scena

In una nuova sessione ARCore, controlla se il dispositivo di un utente supporta l'API Scene Semantics. Non tutti i dispositivi compatibili con ARCore supportano l'API Scene Semantics a causa di limitazioni della potenza di elaborazione.

Per risparmiare risorse, la funzionalità Scene Semantics è disattivata per impostazione predefinita su ARCore. Attiva la modalità semantica per consentire alla tua app di utilizzare l'API Scene Semantics.

// Check whether the user's device supports the Scene Semantics API.
int32_t is_scene_semantics_supported = 0;
ArSession_isSemanticModeSupported(ar_session, AR_SEMANTIC_MODE_ENABLED, &is_scene_semantics_supported);

// Configure the session for AR_SEMANTIC_MODEL_ENABLED.
ArConfig* ar_config = NULL;
ArConfig_create(ar_session, &ar_config);
if (is_scene_semantics_supported) {
  ArConfig_setSemanticMode(ar_session, ar_config, AR_SEMANTIC_MODE_ENABLED);
}
CHECK(ArSession_configure(ar_session, ar_config) == AR_SUCCESS);
ArConfig_destroy(ar_config);

Ottieni l'immagine semantica

Una volta attivata la semantica della scena, è possibile recuperare l'immagine semantica. L'immagine semantica è un'immagine AR_IMAGE_FORMAT_Y8, in cui ogni pixel corrisponde a un'etichetta semantica definita da ArSemanticLabel.

Utilizza ArFrame_acquireSemanticImage() per acquisire l'immagine semantica:

// Retrieve the semantic image for the current frame, if available.
ArImage* semantic_image = NULL;
if (ArFrame_acquireSemanticImage(ar_session, ar_frame, &semantic_image) != AR_SUCCESS) {
  // No semantic image retrieved for this frame.
  // The output image may be missing for the first couple frames before the model has had a chance to run yet.
  return;
}
// If a semantic image is available, use it here.

Le immagini semantiche di output dovrebbero essere disponibili dopo circa 1-3 frame dall'inizio della sessione, a seconda del dispositivo.

Ottenere l'immagine "con fiducia"

Oltre all'immagine semantica, che fornisce un'etichetta per ogni pixel, l'API fornisce anche un'immagine di confidenza dei valori di confidenza dei pixel corrispondenti. L'immagine di confidenza è un'immagine AR_IMAGE_FORMAT_Y8, in cui ogni pixel corrisponde a un valore nell'intervallo [0, 255], corrispondente alla probabilità associata all'etichetta semantica per ogni pixel.

Utilizza ArFrame_acquireSemanticConfidenceImage() per acquisire l'immagine di confidenza semantica:

// Retrieve the semantic confidence image for the current frame, if available.
ArImage* semantic_confidence_image = NULL;
if (ArFrame_acquireSemanticConfidenceImage(ar_session, ar_frame, &semantic_confidence_image) != AR_SUCCESS) {
  // No semantic confidence image retrieved for this frame.
  // The output image may be missing for the first couple frames before the model has had a chance to run yet.
  return;
}
// If a semantic confidence image is available, use it here.

Le immagini di confidenza di output dovrebbero essere disponibili dopo circa 1-3 frame dall'inizio della sessione, a seconda del dispositivo.

Query sulla frazione di pixel per un'etichetta semantica

Puoi anche eseguire query sulla frazione di pixel nel frame corrente che appartengono a una determinata classe, ad esempio "sky". Questa query è più efficiente rispetto al restituire l'immagine semantica ed eseguire una ricerca pixel per pixel di un'etichetta specifica. La frazione restituita è un valore in virgola mobile compreso nell'intervallo [0.0, 1.0].

Utilizza ArFrame_getSemanticLabelFraction() per acquisire la frazione per una determinata etichetta:

// Retrieve the fraction of pixels for the semantic label sky in the current frame.
float out_fraction = 0.0f;
if (ArFrame_getSemanticLabelFraction(ar_session, ar_frame, AR_SEMANTIC_LABEL_SKY, &out_fraction) != AR_SUCCESS) {
  // No fraction of semantic labels was retrieved for this frame.
}