OStack程序员社区-中国程序员成长平台

标题: ios - 在 iPhone X(SceneKit/ARKit 应用程序)上难以从 2D 区域获取面部标志点的深度 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 03:53
标题: ios - 在 iPhone X(SceneKit/ARKit 应用程序)上难以从 2D 区域获取面部标志点的深度

我正在使用 iPhone X 上的前置摄像头运行面部标志检测,并且正在努力获取面部标志的 3D 点(VNFaceLandmarkRegion2D 仅提供图像坐标 X、Y)。

我一直在尝试使用 ARSCNView.hitTestARFrame.hitTest,但到目前为止都没有成功。我认为我的错误可能在于将初始地标点转换为正确的坐标系。我已经尝试了很多排列,但目前根据我的研究,这是我想出的:

let point = CGPoint(x: landmarkPt.x * faceBounds.width + faceBounds.origin.x, y: (1.0 - landmarkPt.y) * faceBounds.height + faceBounds.origin.y)
let screenPoint = CGPoint(point.x * view.bounds.width, point.y * view.bounds.height)
frame.hitTest(screenPoint, types: ARHitTestResult.ResultType.featurePoint)

我也试过了

let newPoint = CGPoint(x: point.x, y: 1.0 - point.y) 

转换后,但似乎没有任何效果。我的 frame.hitTest 结果总是空的。我在转换中遗漏了什么吗?

前置摄像头是否为此增加了另一个层次? (我还尝试在某一点反转初始 X 值,以防坐标系被镜像)。在我看来,初始地标 normalizedPoints 有时为负数,有时也大于 1.0,这对我来说没有任何意义。我正在使用 ARSession.currentFrame?.capturedImage 来捕捉前置摄像头的帧,如果这很重要的话。

任何帮助将非常非常感谢,非常感谢!

-- 解决了--

对于有类似问题的任何人: 我终于得到了 HitTest 结果!

for point in observation.landmarks?.allPoints?.pointsInImage(imageSize: sceneView.bounds.size) {
    let result = ARSCNView.hitTest(point, options: [ARSCNHitTestOption.rootNode: faceNode)
}

我使用面几何体作为附加到面节点的遮挡节点。

感谢瑞克斯特!



Best Answer-推荐答案


您正在使用 ARFaceTrackingConfiguration,对吗?在这种情况下,featurePoint HitTest 类型对您没有帮助,因为特征点是世界跟踪的一部分,而不是面部跟踪……事实上,几乎所有的 ARKit HitTest 机器专用于世界跟踪,对面部跟踪没有用处。

您可以做的是利用面部网格 (ARFaceGeometry) 和面部姿势跟踪 (ARFaceAnchor) 从 2D 图像点到3D 世界空间(或相机空间)点。为此,您至少可以走几条路:

  1. 如果您已经在使用 SceneKit,您可以使用 SceneKit 的 HitTest 来代替 ARKit。 (也就是说,您是针对在 SceneKit 中建模的“虚拟”几何进行测试,而不是针对由 ARKit 建模的真实世界环境的稀疏估计。在这种情况下,面部网格的“虚拟”几何通过以下方式进入 SceneKit ARKit。)也就是说,你想要 ARSCNView.hitTest(_ptions (继承自 SCNSceneRenderer),而不是 hitTest(_:types。当然,这意味着您需要使用 ARSCNFaceGeometry 来可视化场景中的面部网格,并使用 ARSCNView 的节点/ anchor 映射来使其跟踪面部姿势(虽然如果你想让视频图像显示出来,你可以让网格透明)——否则 SceneKit HitTest 将找不到任何 SceneKit 几何体。

  2. 如果您没有使用 SceneKit,或者由于某种原因无法将面部网格放入场景中,那么您将拥有重建面部网格 HitTest 所需的所有信息。 ARCamera 有 View 和投影矩阵,可以告诉你 2D 屏幕投影与 3D 世界空间的关系,ARFaceAnchor 告诉你人脸在世界空间中的位置, ARFaceGeometry 告诉你每个点在脸上的位置——所以它只是一个 bunch of math从屏幕点到面网格点,反之亦然。

关于ios - 在 iPhone X(SceneKit/ARKit 应用程序)上难以从 2D 区域获取面部标志点的深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48155766/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4