在我的 Swift
/ARKit
/SceneKit
项目中,我需要判断前置摄像头中用户的面部是否与摄像头平行。
通过比较与相机的左右眼距离(使用 faceAnchor.leftEyeTransform
和 worldPosition
属性),我能够分辨出水平平行度。
但我被困在垂直平行线上。任何想法,如何实现?
最佳答案
假设您在应用程序中使用 ARFaceTrackingConfiguration
,您实际上可以检索 ARFaceAnchor
和相机的变换以确定它们的方向。您可以使用 simd_float4x4
属性获得世界空间中头部方向的 ARFaceAnchor.transform
矩阵。同样,您可以获得场景的 SCNCamera
或 ARCamera
的变换。
为了在 SceneKit 应用程序中比较相机和面部相对于彼此的方向(尽管 ARKit 方面有类似的功能),我获得了附加到每个节点的世界变换,我们称它们为 faceNode
attach到代表 ARFaceAnchor
的 cameraNode
和 ARSCNView.pointOfView
。例如,要找到相机和您脸部之间的角度,您可以执行以下操作:
let faceOrientation: simd_quatf = faceNode.simdWorldTransform
let cameraOrientation: simd_quatf = cameraNode.simdWorldTransform
let deltaOrientation: simd_quatf = faceOrientation.inverse * cameraOrientation
通过查看
deltaOrientation.angle
和 deltaOrientation.axis
,您可以确定面部和相机之间每个轴上的相对角度。如果你做类似 deltaOrientation.axis * deltaOrientation.angles
的事情,你有一个 simd_float3
向量,让你了解头部相对于相机的俯仰、偏航和滚动(以弧度为单位)。有很多方法可以使用面部 anchor 和相机变换来完成此操作,但这种 simd 四元数方法对我来说效果很好。希望这可以帮助!
关于swift - ARKit:如何判断用户的脸是否与相机平行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53027049/