ARKit:如何判断用户的面部是否与相机平行

时间:2018-10-27 23:07:40

标签: swift scenekit arkit

在我的Swift / ARKit / SceneKit项目中,我需要确定前置摄像头中用户的脸部是否与摄像头平行。

通过比较左眼和右眼距离(使用faceAnchor.leftEyeTransformworldPosition属性),我就能分辨出水平方向的平行度。

但是我被困在垂直平行线上。有什么想法,如何实现?

1 个答案:

答案 0 :(得分:6)

假设您在应用中使用ARFaceTrackingConfiguration,则实际上可以检索ARFaceAnchor和相机的变换以确定它们的方向。您可以使用simd_float4x4属性来获得世界空间中头部方向的ARFaceAnchor.transform矩阵。同样,您可以获取场景的SCNCameraARCamera的变换。

要在SceneKit应用中比较相机和脸部的相对方向(尽管事物在ARKit方面具有相似的功能),我获得了附加到它们各自的节点的世界变换,我们称之为它们faceNode附加在ARFaceAnchor上,而cameraNode代表ARSCNView.pointOfView。例如,要找到相机和脸部之间的角度,可以执行以下操作:

let faceOrientation: simd_quatf = faceNode.simdWorldTransform
let cameraOrientation: simd_quatf = cameraNode.simdWorldTransform
let deltaOrientation: simd_quatf = faceOrientation.inverse * cameraOrientation

通过查看deltaOrientation.angledeltaOrientation.axis,可以确定人脸与相机之间各轴的相对角度。如果您执行类似deltaOrientation.axis * deltaOrientation.angles的操作,则您有一个simd_float3向量,可以使您感觉到头部相对于摄像机的俯仰,偏航和侧倾(以弧度为单位)。

您可以通过多种方式使用面部锚和摄影机转换来执行此操作,但是这种simd四元数方法对我来说效果很好。希望这可以帮助!