我可以使用ARKit 2获取眼睛的测量值

我正在开发一个项目,需要每只眼睛的大小和眼睛之间的距离使用ARKit和iPhone X上的真实深度相机以及Xcode 10 beta 4上的iOS 12 beta 4。

由于我是ARKit的新手,我在网上搜索的解决方案很少。 但是,我在Apple开发者门户网站上看到了一个演示代码 。 在该代码中,我尝试获取所需的值。

还提到了@rickster 的答案

我在ARSCNFaceGeometry和ARFaceAnchor上工作以获取少量值。

func update(withFaceAnchor anchor: ARFaceAnchor) { let faceGeometry = geometry as! ARSCNFaceGeometry faceGeometry.update(from: anchor.geometry) print("\nLook at Point :", anchor.lookAtPoint, "\nLeft :", anchor.leftEyeTransform, "\nRight :", anchor.rightEyeTransform) } 

输出:

看点:float3(0.14502259,0.2905016,0.97809345)

左:simd_float4x4([[0.99312633,-0.030915117,-0.11289084,0.0)],[0.0,0.9644885,-0.26412484,0.0)],[0.11704737,0.26230934,0.9578589,0.0)],[0.03311049,0.028666705,0.028539032,1.0) ]])

右:simd_float4x4([[0.9830616,-0.047965277,-0.17688738,0.0)],[0.0,0.96514606,-0.26171172,0.0)],[0.18327524,0.25727874,0.94879806,0.0)],[ – 0.032072492,0.028482603,0.028181288,1.0 )]])

问题

  1. 如何翻译这些值以使用它并获得一些坐标?

  2. 这段代码会帮助我实现每只眼睛的大小和眼睛之间的距离。 如果不是,那么我该怎么做才能进行测量?

你可以从变换中得到vector3:

 var leftEyePosition = SCNVector3(leftTransform.columns.3.x, leftTransform.columns.3.y, leftTransform.columns.3.z) var rightEyePosition = SCNVector3(rightTransform.columns.3.x, rightTransform.columns.3.y, rightTransform.columns.3.z) 

然后你可以像这样得到2 SCNVector3的距离。

 let d = distance(float3(leftEyePosition), float3(rightEyePosition)) 

结果将以米为单位,因此您可能希望将d除以100

在ARKit 2 / Xcode 10 beta 6 / iOS 12中,“lookAtPoint”无效; 但是我能够得到“leftEyeTransform”和“rightEyeTransform”,然后可以使用这个代码计算眼间距离(在不同距离的两个人身上测试并用尺子validation!):

 func update(withFaceAnchor anchor: ARFaceAnchor) { let faceGeometry = occlusionNode.geometry as! ARSCNFaceGeometry faceGeometry.update(from: anchor.geometry) print("\nLook at Point:", anchor.lookAtPoint, "\nLeft:", anchor.leftEyeTransform, "\nRight:", anchor.rightEyeTransform) var leftEyePosition = SCNVector3(anchor.leftEyeTransform.columns.3.x, anchor.leftEyeTransform.columns.3.y, anchor.leftEyeTransform.columns.3.z) var rightEyePosition = SCNVector3(anchor.rightEyeTransform.columns.3.x, anchor.rightEyeTransform.columns.3.y, anchor.rightEyeTransform.columns.3.z) let d = distance(float3(leftEyePosition), float3(rightEyePosition)) print("\nInter-eye distance in centimeters: ", d * 100) 

}

一些示例输出:

 Look at Point: float3(0.0, 0.0, 0.0) Left: simd_float4x4([[0.9997796, -0.0031222918, 0.020761598, 0.0)], [0.0, 0.98888004, 0.14871553, 0.0)], [-0.020995062, -0.14868274, 0.98866206, 0.0)], [0.031608228, 0.031428084, 0.026632207, 1.0)]]) Right: simd_float4x4([[0.99887705, 0.007054036, -0.04684897, 0.0)], [0.0, 0.9888536, 0.14889139, 0.0)], [0.047377057, -0.1487242, 0.98774314, 0.0)], [-0.031623494, 0.03171173, 0.02669965, 1.0)]]) Inter-eye distance in centimeters: 6.32324 

注意:

没有简单的方法来实际获得学生自己的大小。 有关更多信息,请参阅此StackOverFlow主题和Rickster提供的答案: 获取 ARKit中的大小

但是,使用leftEyeTransformrightEyeTransforms眼睛之间的估计距离:

变换矩阵表示面部左眼和右眼的位置和方向。

在此处输入图像描述

您感兴趣的是这些包含我们需要的数据的第3列。

计算距离的一种简单方法是使用不需要任何额外扩展的GLK助手。

这样的例子可能看起来像这样:

 //---------------------- //MARK ARSCNViewDelegate //---------------------- extension ViewController: ARSCNViewDelegate{ /// Creates A GLKVector3 From a Simd_Float4 /// /// - Parameter transform: simd_float4 /// - Returns: GLKVector3 func glkVector3FromARFaceAnchorTransform(_ transform: simd_float4) -> GLKVector3{ return GLKVector3Make(transform.x, transform.y, transform.z) } func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) { //1. Check We Have A Valid ARFaceAnchor guard let faceAnchor = anchor as? ARFaceAnchor else { return } //2. Get The Position Of The Left & Right Eyes let leftEyePosition = glkVector3FromARFaceAnchorTransform(faceAnchor.leftEyeTransform.columns.3) let righEyePosition = glkVector3FromARFaceAnchorTransform(faceAnchor.rightEyeTransform.columns.3) //3. Calculate The Distance Between Them let distanceBetweenEyesInMetres = GLKVector3Distance(leftEyePosition, righEyePosition) let distanceBetweenEyesInCM = distanceBetweenEyesInMetres/100 print("The Distance Between The Eyes Is Approximatly \(distanceBetweenEyesInCM)") } } 

希望能帮助到你…