Tìm hiểu môi trường của người dùng trên SDK Android (Kotlin/Java)

Tìm hiểu cách sử dụng API Ngữ nghĩa cảnh trong ứng dụng của bạn.

API Ngữ nghĩa cảnh giúp nhà phát triển hiểu được cảnh xung quanh người dùng bằng cách cung cấp thông tin ngữ nghĩa theo thời gian thực dựa trên mô hình học máy. Với hình ảnh của cảnh ngoài trời, API sẽ trả về một nhãn cho mỗi pixel trên một tập hợp các lớp ngữ nghĩa hữu ích, chẳng hạn như bầu trời, toà nhà, cây cối, đường, vỉa hè, phương tiện di chuyển, người, v.v. Ngoài nhãn pixel, API ngữ nghĩa cảnh cũng cung cấp các giá trị tin cậy cho từng nhãn pixel và một cách dễ sử dụng để truy vấn mức độ phổ biến của một nhãn nhất định trong cảnh ngoài trời.

Từ trái sang phải, ví dụ về hình ảnh đầu vào, hình ảnh ngữ nghĩa của nhãn pixel và hình ảnh độ tin cậy tương ứng:

Ví dụ về hình ảnh đầu vào, hình ảnh ngữ nghĩa và hình ảnh độ tin cậy về ngữ nghĩa.

Điều kiện tiên quyết

Hãy đảm bảo bạn hiểu rõ các khái niệm cơ bản về AR và cách định cấu hình một phiên ARCore trước khi tiếp tục.

Bật ngữ nghĩa của cảnh

Trong phiên ARCore mới, hãy kiểm tra xem thiết bị của người dùng có hỗ trợ Scene Semantics API hay không. Không phải thiết bị nào tương thích với ARCore đều hỗ trợ Scene Semantics API do hạn chế về nguồn xử lý.

Theo mặc định, để tiết kiệm tài nguyên, Ngữ nghĩa cảnh sẽ được tắt trên ARCore. Bật chế độ ngữ nghĩa để ứng dụng của bạn sử dụng API Ngữ nghĩa cảnh.

Java

Config config = session.getConfig();

// Check whether the user's device supports the Scene Semantics API.
boolean isSceneSemanticsSupported =
    session.isSemanticModeSupported(Config.SemanticMode.ENABLED);
if (isSceneSemanticsSupported) {
  config.setSemanticMode(Config.SemanticMode.ENABLED);
}
session.configure(config);

Kotlin

val config = session.config

// Check whether the user's device supports the Scene Semantics API.
val isSceneSemanticsSupported = session.isSemanticModeSupported(Config.SemanticMode.ENABLED)
if (isSceneSemanticsSupported) {
  config.semanticMode = Config.SemanticMode.ENABLED
}
session.configure(config)

Lấy hình ảnh ngữ nghĩa

Sau khi bật Ngữ nghĩa cảnh, bạn có thể truy xuất hình ảnh ngữ nghĩa. Hình ảnh ngữ nghĩa là hình ảnh ImageFormat.Y8, trong đó mỗi pixel tương ứng với một nhãn ngữ nghĩa do SemanticLabel xác định.

Sử dụng Frame.acquireSemanticImage() để lấy hình ảnh ngữ nghĩa:

Java

// Retrieve the semantic image for the current frame, if available.
try (Image semanticImage = frame.acquireSemanticImage()) {
  // Use the semantic image here.
} catch (NotYetAvailableException e) {
  // 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.
}

Kotlin

// Retrieve the semantic image for the current frame, if available.
try {
  frame.acquireSemanticImage().use { semanticImage ->
    // Use the semantic image here.
  }
} catch (e: NotYetAvailableException) {
  // No semantic image retrieved for this frame.
}

Hình ảnh ngữ nghĩa đầu ra sẽ có sẵn sau khoảng 1 đến 3 khung hình tính từ đầu phiên, tuỳ thuộc vào thiết bị.

Lấy hình ảnh mức độ tin cậy

Ngoài hình ảnh ngữ nghĩa cung cấp nhãn cho từng pixel, API này cũng cung cấp hình ảnh độ tin cậy của các giá trị độ tin cậy của pixel tương ứng. Hình ảnh tin cậy là hình ảnh ImageFormat.Y8, trong đó mỗi pixel tương ứng với một giá trị trong phạm vi [0, 255], tương ứng với xác suất được liên kết với nhãn ngữ nghĩa cho mỗi pixel.

Sử dụng Frame.acquireSemanticConfidenceImage() để thu thập hình ảnh độ tin cậy về ngữ nghĩa:

Java

// Retrieve the semantic confidence image for the current frame, if available.
try (Image semanticImage = frame.acquireSemanticConfidenceImage()) {
  // Use the semantic confidence image here.
} catch (NotYetAvailableException e) {
  // 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.
}

Kotlin

// Retrieve the semantic confidence image for the current frame, if available.
try {
  frame.acquireSemanticConfidenceImage().use { semanticConfidenceImage ->
    // Use the semantic confidence image here.
  }
} catch (e: NotYetAvailableException) {
  // No semantic confidence image retrieved for this frame.
}

Hình ảnh đầu ra sẽ có độ tin cậy sau khoảng 1 đến 3 khung hình tính từ đầu phiên, tuỳ thuộc vào thiết bị.

Truy vấn tỷ lệ pixel cho nhãn ngữ nghĩa

Bạn cũng có thể truy vấn tỷ lệ pixel trong khung hiện tại thuộc một lớp cụ thể, chẳng hạn như bầu trời. Truy vấn này hiệu quả hơn việc trả về hình ảnh ngữ nghĩa và thực hiện tìm kiếm thông minh theo pixel cho một nhãn cụ thể. Phân số được trả về là một giá trị số thực trong dải ô [0.0, 1.0].

Sử dụng Frame.getSemanticLabelFraction() để lấy phân số của một nhãn cụ thể:

Java

// Retrieve the fraction of pixels for the semantic label sky in the current frame.
try {
  float outFraction = frame.getSemanticLabelFraction(SemanticLabel.SKY);
  // Use the semantic label fraction here.
} catch (NotYetAvailableException e) {
  // No fraction of semantic labels was retrieved for this frame.
}

Kotlin

// Retrieve the fraction of pixels for the semantic label sky in the current frame.
try {
  val fraction = frame.getSemanticLabelFraction(SemanticLabel.SKY)
  // Use the semantic label fraction here.
} catch (e: NotYetAvailableException) {
  // No fraction of semantic labels was retrieved for this frame.
}