Данные глубины из ARKit

Можно ли получить доступ к AVDepthData из ARKit? ARFrame содержит изображение камеры, но не информацию о ее глубине.

Я попытался создать отдельный AVCaptureSession для получения AVDepthData, но мне не удалось запустить AVCaptureSession одновременно с ARKit. Вызывается либо обновление ARSCNView, либо AVCaptureDepthDataOutputDelegate, но не то и другое одновременно.


person Jesse J    schedule 15.08.2017    source источник


Ответы (4)


Как было сказано в этой ветке и упоминается в этой video, нет, ARKit не предоставляет вам AVDepthData, когда вы находитесь в режиме отслеживания мира. AVDepthData предоставляется только тогда, когда вы находитесь в режиме отслеживания лица с помощью iPhone X.

person halileohalilei    schedule 14.10.2017
comment
Да, примерно через месяц после того, как я разместил этот вопрос в Stack Overflow, Apple обновила ARKit API, включив AVDepthData для отслеживания лиц, и наконец ответила мне в этой ветке. С тех пор я отправил отчет об ошибке в Apple, чтобы запросить AVDepthData во время World Tracking Mode. Так что на данный момент это правильный ответ, но, надеюсь, Apple снова обновит API в будущем. - person Jesse J; 14.10.2017
comment
Если у них нет способа получить приблизительную глубину с задней (основной) камеры, тогда почему в ее названии даже есть AR? Разве это не основная предпосылка дополненной реальности? - person pete; 21.05.2019

Это занимает много времени (около 15 секунд), но я создал функцию захвата глубины, используя повторяющиеся вызовы hitTest. Вероятно, это ужасно неоптимально, но я не мог понять, как лучше всего нарисовать изображение, и это первый способ, который я обнаружил, что я действительно достаточно хорошо понял, чтобы реализовать:

let height = Int(arView.frame.height)
let width = Int(arView.frame.width)


UIGraphicsBeginImageContextWithOptions(CGSize(width: width, height: height), true, 0)
while y < height {
  var x = 0
  while x < width {
    let location = CGPoint(x: x, y: y)
    let results = arView.hitTest(location, types: [.featurePoint, .existingPlane, .estimatedVerticalPlane, .estimatedHorizontalPlane, .existingPlaneUsingGeometry, .existingPlaneUsingExtent])
    let alpha = results.isEmpty ? 1.0 : (1.0 / CGFloat(results.count))
    for result in results {
      let value = 1.0 / (result.distance + 1.0)
      switch result.type {
        case .featurePoint:
          UIColor(red: value, green: 0, blue: 0, alpha: alpha).setFill()
        case .existingPlane:
          UIColor(red: 0, green: 1, blue: 0, alpha: alpha).setFill()
        case .estimatedVerticalPlane:
          UIColor(red: 0, green: 0, blue: value, alpha: alpha).setFill()
        case .estimatedHorizontalPlane:
          UIColor(red: 0, green: 0, blue: value, alpha: alpha).setFill()
        case .existingPlaneUsingGeometry:
          UIColor(red: value, green: value, blue: value, alpha: alpha).setFill()
        case .existingPlaneUsingExtent:
          UIColor(red: value, green: value, blue: value, alpha: alpha).setFill()
        default:
          UIColor.black.setFill()
      }
      UIRectFill(CGRect(x: x, y: y, width: 1, height: 1))
    }

    x += 1
  }

  y += 1

}

let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

imgView.image = image

Вы можете настроить цвета, если хотите. В любом случае, я думал, что это дало мне довольно хорошее представление о том, что ARKit думает о мире.

person johnnyb    schedule 13.08.2019

arkit также использует AVCaptureSession, поэтому в настоящее время невозможно использовать arscnview во время работы AVCaptureSession, потому что он вызывает делегат - (void) sessionWasInterrupted: (ARSession *) session; Единственный метод - использовать комплект воспроизведения для записи экрана arkit.

person hzhou    schedule 28.09.2017
comment
Хорошо, но как в этом случае этот проект может получить доступ к AVCaptureSession в один и тот же момент? github.com/AFathi/ARVideoKit - person Adam Roszyk; 21.02.2018
comment
При использовании RealityKit вы можете получить доступ к кадрам из метода делегата, который предоставляет последний отснятый кадр камеры. - person JCutting8; 08.06.2020

В iOS 13 вы можете использовать frameSemantics

let configuration = ARWorldTrackingConfiguration()
configuration.frameSemantics = .personSegmentationWithDepth

Затем в обратном вызове ARSessionDelegate вы можете получить доступ к оценкеDepthData из ARFrame

func session(_ session: ARSession, didUpdate frame: ARFrame) {
     let estimatedDepthData = frame.estimatedDepthData
     ....
}

Вы также можете проверить

https://developer.apple.com/documentation/arkit/arframe/3152989-estimateddepthdata

https://developer.apple.com/documentation/arkit/arframe/2984226-segmentationbuffer

person Psycrow    schedule 24.07.2019
comment
При использовании вышеупомянутого я получаю следующее исключение: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'This set of frame semantics is not supported on this configuration' Думаю, даже на iOS13 это все еще не поддерживается: \ - person YanivH; 27.07.2019