Добавьте Anchor в ARView с помощью CoreML и VisionKit.IOS

Программируем под IOS
Ответить
Anonymous
 Добавьте Anchor в ARView с помощью CoreML и VisionKit.

Сообщение Anonymous »

Я использую ARView RealityKit для разработки прототипа.
Целью прототипа является сканирование различных продуктов, расположенных на разных стойках на полке (предположим, что любой продовольственный магазин где чипы расположены на большой полке и расположены в стойках внутри полки).
Мы разработали пакет .ml, который будет предоставлять прогнозы продуктов и связанные с ними координаты ограничивающего прямоугольника для данного входного изображения. . Мы использовали делегат ARSessionDelegate

Код: Выделить всё

func session(_ session: ARSession, didUpdate frame: ARFrame)
метод для захвата предварительного просмотра в реальном времени.

Код: Выделить всё

func session(_ session: ARSession, didUpdate frame: ARFrame) {
guard let pixelBuffer = frame.capturedImage as CVPixelBuffer? else { return }
DispatchQueue.global(qos: .userInitiated).async {
do {
let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: .right, options: [:])
try handler.perform([self.visionRequest])
} catch {
print("error in classify fame error \(error)")
}
}
}
мы используем VNImageRequestHandler VisionKit для обработки запросов, как показано ниже.

Код: Выделить всё

lazy var visionRequest: VNCoreMLRequest = {
let request = VNCoreMLRequest(model: mlModel, completionHandler: {
[weak self] request, error in
DispatchQueue.main.async {
self?.processPredictions(predictions: request.results as? [VNRecognizedObjectObservation] ?? [])
}
})
return request
}()
Здесь мы хотели добиться того, чтобы при получении прогнозов, данных с помощью VisionRequest, мы вызывали методprocessPredictions для обработки. Мы ожидали добавить привязку к каждому прогнозу, полученному от VisionRequest. Ниже приведен код, реализованный для достижения того же. ConvertToWorldPosition — это удобный метод, который использует метод hitTest ARView для предоставления вектора мирового преобразования для заданного значения (который представляет собой не что иное, как центроид каждого ограничивающего прямоугольника прогноза).

Код: Выделить всё

func processPredictions(predictions: [VNRecognizedObjectObservation]) {
print("count \(predictions.count)")
overlayLayer.sublayers?.forEach { $0.removeFromSuperlayer() }
for prediction in predictions {
let boundingBox = prediction.boundingBox
let centroid = CGPoint(
x: boundingBox.origin.x + boundingBox.width / 2,
y: boundingBox.origin.y + boundingBox.height / 2
)

if let worldTransform = convertToWorldPosition(from: centroid, frame: self.arView.session.currentFrame!) {
let anchor = ARAnchor(name: "Detected Object", transform: worldTransform)
arView.session.add(anchor: anchor)
lastAnchors[anchor.identifier] = worldTransform
}
}
}

private func convertToWorldPosition(from point: CGPoint, frame: ARFrame) -> simd_float4x4? {
let hitTestResults = frame.hitTest(point, types: [.featurePoint, .estimatedHorizontalPlane])
return hitTestResults.first?.worldTransform
}
Здесь возникают 3 проблемы:
  • Привязки не помещаются в центр ограничивающего
    блока.
  • Якоря продолжают плавать по экрану.
  • Якорь не отображается точно заданный центроид местоположения.
Может кто-нибудь подсказать, что может быть не так в реализации? Если у вас есть другой подход к решению этого варианта использования, предложите его.

Подробнее здесь: https://stackoverflow.com/questions/793 ... -visionkit
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»