如何确定检测到的人脸是否像图像一样平坦或在 ARKit 中具有不同的地形?我目前正在使用
ARFaceTrackingConfiguration
.
我尝试的一种方法是找到每个顶点与面部几何形状之间的平均距离,如果它低于某个任意阈值,则认为面部是平坦的。
let vertices = faceGeometry.vertices
var totalDistance: Float = 0
for i in 0..<vertices.count {
let vertex = vertices[i]
totalDistance += simd_length(vertex)
}
let averageDistance: Float = totalDistance / Float(vertices.count)
if averageDistance < 0.07 {
print("Flat face")
} else {
print("Real face")
}
这个想法是,平均而言,平面通常会有更近的顶点。然而,这种方法在测试时提供了不同的结果。
我也试过比较假脸(图像)和真实 3D 脸的深度,但由于前者应该是平的,它们结果是一样的。
var minZ = Float.infinity
var maxZ = -Float.infinity
for vertex in faceAnchor.geometry.vertices {
let vertexVector = simd_float4(vertex, 1)
let worldVertex = faceAnchor.transform * vertexVector
let transformedVertex = SCNVector3(worldVertex.x, worldVertex.y, worldVertex.z)
minZ = min(minZ, transformedVertex.z)
maxZ = max(maxZ, transformedVertex.z)
}
let depth = maxZ - minZ
print(depth)
您需要分析带有人脸(或具有真实拓扑结构的人)的平面图像的深度图,以了解灰色的均匀性。平面图像具有微妙的渐变(几乎是纯灰色),而真实面部具有大量灰色调。