我需要创建一个应用程序,我们要在其中测量设备和用户面部之间的距离。我认为它可以通过 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。
ARSCNView
的 pointOfView
属性返回查看场景的节点,基本上是相机。 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/