【问题标题】:Can I get the measurements for eyes using ARKit 2我可以使用 ARKit 2 测量眼睛吗
【发布时间】:2019-01-03 00:30:56
【问题描述】:

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

由于我是 ARKit 的新手,我正在网上搜索解决方案,但了解甚少。但是,我遇到了demo code on apple developer portal。在该代码中,我尝试获取所需的值。

Also referred to the answer@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. 这段代码能否帮助我实现每只眼睛的大小和距离 两眼之间。如果不是,那我该怎么做才能得到测量值?

【问题讨论】:

    标签: ios swift arkit iphone-x ios12


    【解决方案1】:

    在 ARKit 2 / Xcode 10 beta 6 / iOS 12 中“lookAtPoint”为空;但我能够获得“leftEyeTransform”和“rightEyeTransform”,然后可以使用此代码计算眼间距离(在不同距离的两个人身上进行了测试,并用尺子进行了验证!):

    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
    

    注意:

    【讨论】:

      【解决方案2】:

      瞳距的一条线解:

      simd_distance(faceAnchor.rightEyeTransform.columns.3, faceAnchor.leftEyeTransform.columns.3)
      

      乘以 100 得到以厘米为单位的答案。 如上所述,没有一种简单的方法可以测量虹膜或瞳孔大小,因此您需要开发一种算法来执行以下操作:

      1) 找到圆圈并过滤描述虹膜的圆圈

      2) 使用 ARKit 计算像素到毫米的值,并用它来计算虹膜大小

      【讨论】:

        【解决方案3】:

        你可以从变换中得到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

        【讨论】:

        • 这会是两只眼睛之间的距离吗..?
        • 这将为您提供眼球原点之间的距离,如果这是您要问的,这可能与瞳孔间距不远?如果您需要眼睛之间的距离(边缘到边缘),您可以减去 1 只眼睛的直径。
        【解决方案4】:

        没有简单的方法可以实际获取学生本身的大小。有关更多信息,请参阅此 StackOverFlow 线程和 Rickster 提供的答案:Getting The Sizes Of The Eyes In ARKit

        然而,使用leftEyeTransformrightEyeTransforms 可以得到眼睛之间的估计距离,它们很简单:

        变换矩阵,指示位置和方向 脸的左右眼。

        您感兴趣的是其中包含我们需要的数据的第三列。

        计算距离的一种简单方法是使用不需要任何额外扩展的 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)")
        
            }
        
        }
        

        希望对你有帮助...

        【讨论】:

          猜你喜欢
          • 2017-04-15
          • 1970-01-01
          • 2020-09-30
          • 2013-12-30
          • 2011-09-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-20
          • 2011-05-02
          相关资源
          最近更新 更多