如何借助iOS中的ARKit测量设备与面部的距离?

时间:2018-06-27 16:13:46

标签: ios iphone swift arkit

我需要创建一个我们想要在其中测量设备和用户面部之间距离的应用程序。我认为ARKit可能实现此目标,但不知道如何实现。是否有任何示例或示例?

3 个答案:

答案 0 :(得分:2)

如果您运行的是ARFaceTrackingConfiguration(仅适用于iPhone X),则至少可以通过两种方法来实现(我认为第二种方法更好)。

第一种方法

您可以使用红外摄像机的depthData

yourARSceneView.session.currentFrame?.capturedDepthData?.depthDataMap

这将返回大小为640x360的CVPixelBuffer,其中包含每个像素的深度数据(基本上是IR摄像机与世界上真实物体之间的距离)。您可以通过this one之类的可用扩展名访问CVPixelBuffer数据。深度数据以米表示。获得深度数据后,您将必须选择或检测哪些是用户面部的一部分。您还必须注意“深度感应摄像头以与彩色摄像头不同的帧速率提供数据,因此,如果没有与当前彩色图像同时捕捉到深度数据,则此属性的值也可以为零”。有关更多信息:AVDepthData

第二种方法(推荐)

获取设备与用户面部之间距离的另一种方法是将检测到的用户面部的位置转换为相机的坐标系。 为此,您必须使用SceneKit中的convertPosition方法才能将坐标空间从面部坐标空间切换到相机坐标空间。

let positionInCameraSpace = theFaceNode.convertPosition(pointInFaceCoordinateSpace, to: yourARSceneView.pointOfView)

theFaceNode是ARKit创建的SCNNode,代表用户的脸部。 pointOfView的{​​{1}}属性返回从中查看场景的节点,基本上是摄像机。 ARSCNView可以是面网格的任何顶点,也可以是pointInFaceCoordinateSpace(即the origin of the face coordinate system)的位置。 在这里,theFaceNodepositionInCameraSpace,代表您给出的点在相机坐标空间中的位置。然后,您可以使用此SCNVector3的x,y和z值(以米为单位)获得点与相机之间的距离。

我猜第二种方法更好,因为它看起来更精确,您可以精确选择要测量的脸部哪个点。您还可以按 Rom4in 所述使用转换(我猜convertPosition方法使用转换)。希望这会有所帮助,我也很好奇是否有更简单的方法来实现这一目标。

答案 1 :(得分:0)

相机和面部都进行了变换,然后可以计算它们之间的距离。

答案 2 :(得分:0)

我在ARKit库中使用renderer(didUpdate)方法进行了此操作,然后可以将其全部存储在变量中或写入文件中。在这里,我将所有数据存储在这样的变量中,

 func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor)
    {
         var data = "\(Date().timeIntervalSince1970 * 1000),\  (node.position.x),\(node.position.y),\(node.position.z)\n"
     }