如何确定检测到的人脸是像图像一样平坦,还是在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)
1条答案
按热度按时间velaa5lx1#
AV基金会+愿景
你需要分析一张有脸的平面图像(或一个有真实的拓扑的人)的深度图,以获得灰度的均匀性。平面图像有一个微妙的渐变(几乎是纯灰色),而真实的人脸有大量的灰色调。要优化Apple Vision对检测到的脸的分析,请使用VNDetectFaceRectanglesRequest类将处理限制在边界框内。
这是一个sample code,帮助您可视化来自TrueDepth摄像头的深度数据。