来自ARKit的深度数据

时间:2017-08-15 23:41:49

标签: avcapturesession ios11 arkit

是否可以从ARKit访问AVDepthData? ARFrame包含相机的图像,但不包含其深度信息。

我尝试创建一个单独的AVCaptureSession来接收AVDepthData,但是我无法在ARKit的同时运行AVCaptureSession。要么调用ARSCNView更新,要么调用AVCaptureDepthDataOutputDelegate,但不能同时调用它们。

4 个答案:

答案 0 :(得分:1)

正如在this主题中回答并在此video中提到的那样,不,当您处于世界跟踪模式时,ARKit不会为您提供AVDepthData。只有当您使用iPhone X进行面部跟踪模式时,才会向您提供AVDepthData

答案 1 :(得分:0)

arkit也使用AVCaptureSession,所以到现在AVCaptureSession正在进行时不可能使用arscnview,因为它会调用delegate - (void)sessionWasInterrupted:(ARSession *)session; 只有方法是使用重放工具包来记录arkit屏幕。

答案 2 :(得分:0)

在iOS 13中,您可以使用frameSemantics

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

然后,在ARSessionDelegate回调中,您可以从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

答案 3 :(得分:0)

这需要很长时间(大约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关于世界的想法有了一个很好的了解。