Poznawanie środowiska użytkownika w pakiecie Android NDK (C)

Dowiedz się, jak używać interfejsu Scene Semantics API w swoich aplikacjach.

Interfejs Scene Semantics API umożliwia deweloperom analizowanie sceny wokół użytkownika dzięki dostarczaniu informacji semantycznych w czasie rzeczywistym na podstawie modelu uczenia maszynowego. Po otrzymaniu obrazu przedstawiającego scenę na zewnątrz interfejs API zwraca etykietę dla każdego piksela w ramach zestawu przydatnych klas semantycznych, takich jak niebo, budynek, drzewo, droga, chodnik, pojazd, osoba itp. Oprócz etykiet pikseli interfejs API semantyki sceny udostępnia też wartości ufności dla każdej etykiety piksela oraz łatwy sposób na zapytanie o występowanie danej etykiety w scenie na zewnątrz.

Od lewej do prawej przykłady obrazu wejściowego, semantyczny obraz etykiet pikseli i odpowiadający mu obraz ufności:

Przykład obrazu wejściowego, obrazu semantycznego i semantycznego obrazu ufności.

Wymagania wstępne

Upewnij się, że znasz podstawowe pojęcia związane z AR. i dowiedz się, jak skonfigurować sesję ARCore, zanim przejdziesz dalej.

Włącz semantykę sceny

nowej sesji ARCore sprawdź, czy urządzenie użytkownika obsługuje interfejs Scene Semantics API. Nie wszystkie urządzenia zgodne z ARCore obsługują interfejs Scene Semantics API ze względu na ograniczenia mocy obliczeniowej.

Aby można było oszczędzać zasoby, semantyka sceny jest domyślnie wyłączona w ARCore. Włącz tryb semantyczny, aby aplikacja mogła korzystać z interfejsu Scene Semantics API.

// 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);

Uzyskiwanie obrazu semantycznego

Po włączeniu semantyki sceny można pobrać obraz semantyczny. Obraz semantyczny to obraz AR_IMAGE_FORMAT_Y8, w którym każdy piksel odpowiada etykiecie semantycznej zdefiniowanej przez ArSemanticLabel.

Aby uzyskać obraz semantyczny, użyj ArFrame_acquireSemanticImage():

// 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.

Zdjęcia semantyczne powinny być dostępne po około 1–3 klatkach od rozpoczęcia sesji, w zależności od urządzenia.

Uzyskiwanie obrazu ufności

Oprócz obrazu semantycznego, który zawiera etykietę dla każdego piksela, interfejs API udostępnia też obraz ufności z odpowiadającymi mu wartościami ufności piksela. Obraz ufności to obraz AR_IMAGE_FORMAT_Y8, w którym każdy piksel odpowiada wartości z zakresu [0, 255], odpowiadającej prawdopodobieństwu związanemu z etykietą semantyczną dla każdego piksela.

Użyj metody ArFrame_acquireSemanticConfidenceImage(), aby uzyskać semantyczny obraz ufności:

// 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.

Wyjściowe obrazy ufności powinny być dostępne po około 1–3 klatkach od początku sesji (w zależności od urządzenia).

Zapytanie o ułamek pikseli etykiety semantycznej

Możesz też wysyłać zapytania dotyczące odsetka pikseli w bieżącej ramce, które należą do określonej klasy, na przykład nieba. To zapytanie jest skuteczniejsze niż zwracanie obrazu semantycznego i wyszukiwanie określonej etykiety za pomocą pikseli. Zwracany ułamek jest wartością zmiennoprzecinkową z zakresu [0.0, 1.0].

Aby uzyskać ułamek dla danej etykiety, użyj ArFrame_getSemanticLabelFraction():

// 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.
}