【问题标题】:ARKit: Tracking Head Up and Down Movement in XcodeARKit:在 Xcode 中跟踪头部上下运动
【发布时间】:2021-01-24 07:01:47
【问题描述】:

我已经实现了以下代码,它允许我跟踪一个人的不同面部表情。但是,使用此代码,我无法使用 Xcode 中的 ARKit 跟踪人的头部上下运动。如果有人能告诉我如何使用 Xcode 使用 ARKit 跟踪人的头部上下运动,我将不胜感激!

import UIKit
import SceneKit
import ARKit

class ViewController: UIViewController, ARSCNViewDelegate {

@IBOutlet var sceneView: ARSCNView!
@IBOutlet weak var faceLabel: UILabel!
@IBOutlet weak var labelView: UIView!
var analysis = ""

override func viewDidLoad() {
    super.viewDidLoad()
    
    labelView.layer.cornerRadius = 10
    
    sceneView.delegate = self
    sceneView.showsStatistics = true
    guard ARFaceTrackingConfiguration.isSupported else {
        fatalError("Face tracking is not supported on this device")
    }
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
    // Create a session configuration
    let configuration = ARFaceTrackingConfiguration()

    // Run the view's session
    sceneView.session.run(configuration)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    
    // Pause the view's session
    sceneView.session.pause()
}

// MARK: - ARSCNViewDelegate
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
    let faceMesh = ARSCNFaceGeometry(device: sceneView.device!)
    let node = SCNNode(geometry: faceMesh)
    node.geometry?.firstMaterial?.fillMode = .lines
    return node
}

func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
    if let faceAnchor = anchor as? ARFaceAnchor, let faceGeometry = node.geometry as? ARSCNFaceGeometry {
        faceGeometry.update(from: faceAnchor.geometry)
        expression(anchor: faceAnchor)
        
        DispatchQueue.main.async {
            self.faceLabel.text = self.analysis
        }
        
    }
}

func expression(anchor: ARFaceAnchor) {
    let smileLeft = anchor.blendShapes[.mouthSmileLeft]
    let smileRight = anchor.blendShapes[.mouthSmileRight]
    let cheekPuff = anchor.blendShapes[.cheekPuff]
    let tongue = anchor.blendShapes[.tongueOut]
    self.analysis = ""
    
    if ((smileLeft?.decimalValue ?? 0.0) + (smileRight?.decimalValue ?? 0.0)) > 0.9 {
        self.analysis += "You are smiling. "
    }
    
    if cheekPuff?.decimalValue ?? 0.0 > 0.1 {
        self.analysis += "Your cheeks are puffed. "
    }
    
    if tongue?.decimalValue ?? 0.0 > 0.1 {
        self.analysis += "Don't stick your tongue out! "
    }
}
}

【问题讨论】:

    标签: ios augmented-reality scenekit arkit


    【解决方案1】:

    Instance 属性blendShapes 是代表面部表情的 52 个系数的字典。点头不是必须检测的面部表情,所以实现摇头最快的方法是控制ARFaceAnchor的方向或节点的方向。

    func renderer(_ renderer: SCNSceneRenderer,
              didUpdate node: SCNNode,
                  for anchor: ARAnchor) {
    
        if let faceAnchor = anchor as? ARFaceAnchor,
           let faceGeo = node.geometry as? ARSCNFaceGeometry {
                
            if faceAnchor.lookAtPoint.y <= 0 {
                print("A head is...")
            }
                
            if node.orientation.x >= Float.pi/32 {
                print("A head is...")
            }
        }
    }
    

    【讨论】:

    • 感谢您的回答。我想指出的一件事是,当头部向上时,它会打印“A head is down”。所以,我认为打印语句需要颠倒。否则,它工作正常。欣赏!
    猜你喜欢
    • 2018-09-02
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多