我正在使用 ARCore-IOS 创建 AR IOS 应用程序。 https://github.com/google-ar/arcore-ios-sdk/tree/v1.25.0 我可以从这个模块获得鼻子、左前额和右前额区域点以及面部旋转。
但我需要文档中提到的所有 468 个面部标志点。但是没有返回 468 点的特定方法或类。那么,我们如何在 IOS 原生或 Flutter 中获得 468 个人脸标志点,使用或不使用 ARCore。
我正在使用 ARCore-IOS 创建 AR IOS 应用程序。 https://github.com/google-ar/arcore-ios-sdk/tree/v1.25.0 我可以从这个模块获得鼻子、左前额和右前额区域点以及面部旋转。
但我需要文档中提到的所有 468 个面部标志点。但是没有返回 468 点的特定方法或类。那么,我们如何在 IOS 原生或 Flutter 中获得 468 个人脸标志点,使用或不使用 ARCore。
GARAugmentedFace 类包含一个网格,其中包含 3D 顶点位置。例如,在 SCNSceneRendererDelegate 方法中:
if let face = frame.face {
print(face.mesh.vertices[467])
}
https://developers.google.com/ar/reference/ios/interface_g_a_r_augmented_face_mesh
所有顶点位置都在它们的默认位置,即在 canonical_face_mesh 中。如果您想要相机中单个面部的顶点位置,您需要从场景套件几何体中获取该信息,该几何体方便地存储在 faceTextureNode 中。提取数据不太方便。
faceTextureNode.geometry = faceMeshConverter.geometryFromFace(face)
faceVertices = vertexPositionFromSCNGeometry(geometry: faceTextureNode.geometry!)
private func vertexPositionFromSCNGeometry(geometry: SCNGeometry) -> [SCNVector3] {
let geometrySources = geometry.sources(for: SCNGeometrySource.Semantic.vertex)
var geometryVertices = [SCNVector3()]
if let geometrySource = geometrySource.first{
let stride = geometrySource.dataStride
...
let vector = SCNVector3Make(buffer[0], buffer[1], buffer[2])
return vector
})
geometryVertices = vertices
}
return geometryVertices
}
其余功能可以从这里的详细答案填写: https ://stackoverflow.com/a/66748865/14437826
顶点位置是相对于面部中心变换的。如果您想要原始位置,则必须使用中心变换进行计算。