使用 ARKit 的人脸和相机之间的距离 [英] Distance between face and camera using ARKit

查看:27
本文介绍了使用 ARKit 的人脸和相机之间的距离的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有什么地方可以使用 ARKit 获得相机和人脸之间的距离吗?

解决方案

我认为这可以通过使用 ARFaceAnchor.leftEyeTransformARFaceAnchor.rightEyeTransform 属性来实现.>

一旦你有了这些,你就可以使用眼睛的 worldPosition 并减去相机的位置来获得眼睛到相机的大致距离,例如SCNVector3Zero.

下面是一个非常粗略的例子,所有的代码都被注释掉了,所以它应该很容易理解:

//------------------------------//标记:- SCNVector3 扩展//------------------------------扩展 SCNVector3{///获取我们向量的长度func 长度() ->浮动 { 返回 sqrtf(x * x + y * y + z * z) }///允许我们减去两个 SCNVector3静态函数 - (l: SCNVector3, r: SCNVector3) ->SCNVector3 { return SCNVector3Make(l.x - r.x, l.y - r.y, l.z - r.z) }}//-------------//标记:- ARSCNViewDelegate//-------------扩展视图控制器:ARSCNViewDelegate{func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {//1.设置 FaceNode &添加眼睛faceNode = 节点faceNode.addChildNode(leftEye)faceNode.addChildNode(rightEye)faceNode.transform = node.transform//2.获取眼睛与相机的距离轨道距离()}func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {faceNode.transform = node.transform//2.检查我们有一个有效的 ARFaceAnchor守卫让 faceAnchor = 锚定为?ARFaceAnchor else { return }//3.更新左边的变换来自锚变换的右眼leftEye.simdTransform = faceAnchor.leftEyeTransformrightEye.simdTransform = faceAnchor.rightEyeTransform//4.获取眼睛与相机的距离轨道距离()}///跟踪眼睛与相机的距离功能轨迹距离(){DispatchQueue.main.async {//4.获取眼睛与相机的距离让 leftEyeDistanceFromCamera = self.leftEye.worldPosition - SCNVector3Zero让 rightEyeDistanceFromCamera = self.rightEye.worldPosition - SCNVector3Zero//5.计算眼睛到相机的平均距离让 averageDistance = (leftEyeDistanceFromCamera.length() + rightEyeDistanceFromCamera.length())/2让 averageDistanceCM = (Int(round(averageDistance * 100)))打印(人脸与相机的近似距离 = \(averageDistanceCM)")}}}类视图控制器:UIViewController{@IBOutlet var sceneView:ARSCNView!var faceNode = SCNNode()var leftEye = SCNNode()var rightEye = SCNNode()//----------------------//MARK: - 查看生命周期//----------------------覆盖 func viewDidLoad() {super.viewDidLoad()//1.设置人脸追踪守卫 ARFaceTrackingConfiguration.isSupported else { return }让配置 = ARFaceTrackingConfiguration()configuration.isLightEstimationEnabled = true场景视图.delegate = selfsceneView.showsStatistics = truesceneView.session.run(配置,选项:[.resetTracking, .removeExistingAnchors])//2.设置眼节点设置眼节点()}覆盖 func viewWillAppear(_animated: Bool) { super.viewWillAppear(animated) }//----------------------//MARK: - 眼节点设置//----------------------///创建到 SCNSpheres 来松散地代表眼睛func setupEyeNode(){//1.创建一个节点来代表眼睛让 eyeGeometry = SCNSphere(半径:0.005)eyeGeometry.materials.first?.diffuse.contents = UIColor.cyaneyeGeometry.materials.first?.transparency = 1//2.创建一个持有者节点 &旋转它,使 Gemoetry 指向设备让节点 = SCNNode()node.geometry = eyeGeometrynode.eulerAngles.x = -.pi/2节点.位置.z = 0.1//3.创造左派右眼leftEye = node.clone()rightEye = node.clone()}}

希望能帮到你...

Is there any where are you to get distance between camera and face using ARKit ?

解决方案

I think this is possible by using the ARFaceAnchor.leftEyeTransform and ARFaceAnchor.rightEyeTransform properties.

Once you have these you can get the approximate distance of the eyes to the Camera using the worldPosition of the Eyes and subtracting the position of the Camera e.g. SCNVector3Zero.

Below is a very crude example with all the code commented so it should be easy enough to understand:

//------------------------------
// MARK: - SCNVector3 Extensions
//------------------------------

extension SCNVector3{

    ///Get The Length Of Our Vector
    func length() -> Float { return sqrtf(x * x + y * y + z * z) }

    ///Allow Us To Subtract Two SCNVector3's
    static func - (l: SCNVector3, r: SCNVector3) -> SCNVector3 { return SCNVector3Make(l.x - r.x, l.y - r.y, l.z - r.z) }
}

//--------------------------
// MARK: - ARSCNViewDelegate
//--------------------------

extension ViewController: ARSCNViewDelegate{

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

        //1. Setup The FaceNode & Add The Eyes
        faceNode = node
        faceNode.addChildNode(leftEye)
        faceNode.addChildNode(rightEye)
        faceNode.transform = node.transform

        //2. Get The Distance Of The Eyes From The Camera
        trackDistance()
    }

    func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {

        faceNode.transform = node.transform

        //2. Check We Have A Valid ARFaceAnchor
        guard let faceAnchor = anchor as? ARFaceAnchor else { return }

        //3. Update The Transform Of The Left & Right Eyes From The Anchor Transform
        leftEye.simdTransform = faceAnchor.leftEyeTransform
        rightEye.simdTransform = faceAnchor.rightEyeTransform

        //4. Get The Distance Of The Eyes From The Camera
        trackDistance()
    }


    /// Tracks The Distance Of The Eyes From The Camera
    func trackDistance(){

        DispatchQueue.main.async {

            //4. Get The Distance Of The Eyes From The Camera
            let leftEyeDistanceFromCamera = self.leftEye.worldPosition - SCNVector3Zero
            let rightEyeDistanceFromCamera = self.rightEye.worldPosition - SCNVector3Zero

            //5. Calculate The Average Distance Of The Eyes To The Camera
            let averageDistance = (leftEyeDistanceFromCamera.length() + rightEyeDistanceFromCamera.length()) / 2
            let averageDistanceCM = (Int(round(averageDistance * 100)))
            print("Approximate Distance Of Face From Camera = \(averageDistanceCM)")
        }
    }
}

class ViewController: UIViewController{

    @IBOutlet var sceneView: ARSCNView!

    var faceNode = SCNNode()
    var leftEye = SCNNode()
    var rightEye = SCNNode()

    //-----------------------
    // MARK: - View LifeCycle
    //-----------------------

    override func viewDidLoad() {
        super.viewDidLoad()

        //1. Set Up Face Tracking
        guard ARFaceTrackingConfiguration.isSupported else { return }
        let configuration = ARFaceTrackingConfiguration()
        configuration.isLightEstimationEnabled = true
        sceneView.delegate = self
        sceneView.showsStatistics = true
        sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])

        //2. Setup The Eye Nodes
        setupEyeNode()
    }

    override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) }

    //-----------------------
    // MARK: - Eye Node Setup
    //-----------------------

    /// Creates To SCNSpheres To Loosely Represent The Eyes
    func setupEyeNode(){

        //1. Create A Node To Represent The Eye
        let eyeGeometry = SCNSphere(radius: 0.005)
        eyeGeometry.materials.first?.diffuse.contents = UIColor.cyan
        eyeGeometry.materials.first?.transparency = 1

        //2. Create A Holder Node & Rotate It So The Gemoetry Points Towards The Device
        let node = SCNNode()
        node.geometry = eyeGeometry
        node.eulerAngles.x = -.pi / 2
        node.position.z = 0.1

        //3. Create The Left & Right Eyes
        leftEye = node.clone()
        rightEye = node.clone()
    }

}

Hope it helps...

这篇关于使用 ARKit 的人脸和相机之间的距离的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆