代码之家  ›  专栏  ›  技术社区  ›  Piyush Mathur

我能用ARKit 2测量眼睛吗

  •  3
  • Piyush Mathur  · 技术社区  · 8 年前

    我正在做一个项目,要求每个眼睛的大小和眼睛之间的距离,使用ARKit和iPhone X上的真深度相机,xcode10beta4上的ios12beta4。

    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)

    [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úu float4x4([[0.9830616,-0.047965277,-0.17688738,0.0], [0.0,0.96514606,-0.26171172,0.0],[0.18327524,0.25727874,

    问题

    1. 如何转换这些值以利用它并获得一些 协调?

    2. 两眼之间。如果没有,那我该怎么做才能得到测量结果呢?

    4 回复  |  直到 8 年前
        1
  •  2
  •   Rob Tow    8 年前

    在ARKit 2/Xcode 10 beta 6/iOS 12中,“lookAtPoint”是空的;但是我可以得到“leftEyeTransform”和“righteeyetransform”,然后可以使用此代码计算眼睛之间的距离(在两个人不同距离上测试并用尺子验证!):

    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
  •  1
  •   Rom4in    8 年前

    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)
    

    然后你就可以得到这样的距离。

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

    结果将以米为单位,所以您可能需要将d除以100

        3
  •  1
  •   EdiZ    7 年前

    小学生距离的单线解决方案:

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

    如上所述,没有一种简单的方法来测量虹膜或瞳孔大小,因为您需要开发一种算法来执行以下操作:

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

        4
  •  0
  •   BlackMirrorz    8 年前

    没有一种简单的方法能真正得到学生的尺寸。有关更多信息,请参阅此StackOverFlow线程和Rickster提供的答案: Getting The Sizes Of The Eyes In ARKit

    但是,使用 leftEyeTransform rightEyeTransforms 简单来说就是:

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

    enter image description here

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

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

    //----------------------
    //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)")
    
        }
    
    }