ios - 如何在 iOS 中借助 ARKit 测量设备与人脸的距离?

标签 ios iphone swift arkit

我需要创建一个应用程序,我们要在其中测量设备和用户面部之间的距离。我认为它可以通过 ARKit 但不知道该怎么做。有什么样本或例子吗?

最佳答案

如果您正在运行 ARFaceTrackingConfiguration(仅适用于带有前置 TrueDepth 摄像头的设备),至少有两种方法可以实现这一点(我认为第二种更好)。

第一种方法

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

yourARSceneView.session.currentFrame?.capturedDepthData?.depthDataMap

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

第二种方法(推荐)

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

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

theFaceNode 是 ARKit 创建的代表用户面部的 SCNNode。 ARSCNViewpointOfView 属性返回查看场景的节点,基本上是相机。 pointInFaceCoordinateSpace 可以是面部网格的任何顶点或只是 theFaceNode 的位置(即 the origin of the face coordinate system )。 此处,positionInCameraSpace 是一个 SCNVector3,代表您指定的点在相机坐标空间中的位置。然后,您可以使用此 SCNVector3 的 x、y 和 z 值(以米表示)获取点与相机之间的距离。

我想第二种方法更好,因为它看起来更精确,而且您可以精确选择要测量面部的哪个点。您也可以像 Rom4in 所说的那样使用转换(我猜 convertPosition 方法使用转换)。希望它会有所帮助,我也很想知道是否有更简单的方法来实现这一目标。

关于ios - 如何在 iOS 中借助 ARKit 测量设备与人脸的距离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51067286/

相关文章:

ios - OpenCV 构建问题,找不到 ext/atomicity.h

iphone - Flurry 应用程序的 session 数据需要多长时间才能显示在 Flurry 网站上

iphone - 如何延迟Default.png?

触摸时未检测到 Swift/Spritekit SKNode

json - 获取此输出 json 的所有值

ios - 声明委托(delegate)符合另一个协议(protocol)

ios - 在 'levelCompleted' 类型的对象上找不到属性 'id'

ios - Swift 中用于安全初始化 @IBInspectables 的单行代码

ios - 在模态视图 Controller 后面更改 View Controller

ios - 尽管有限制,我该如何实现这个应用程序?