菜鸟教程小白 发表于 2022-12-13 03:53:37

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


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

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

<pre><code>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)
</code></pre>

<p>我也试过了</p>

<pre><code>let newPoint = CGPoint(x: point.x, y: 1.0 - point.y)
</code></pre>

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

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

<p>任何帮助将非常非常感谢,非常感谢!</p>

<p>-- 解决了--</p>

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

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

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

<p>感谢瑞克斯特!</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您正在使用 <code>ARFaceTrackingConfiguration</code>,对吗?在这种情况下,<code>featurePoint</code>HitTest 类型对您没有帮助,因为特征点是世界跟踪的一部分,而不是面部跟踪……事实上,几乎所有的 <em>ARKit</em>HitTest 机器专用于世界跟踪,对面部跟踪没有用处。 </p>

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

<ol>
<li><p>如果您已经在使用 SceneKit,您可以使用 <em>SceneKit</em> 的 HitTest 来代替 ARKit。 (也就是说,您是针对在 SceneKit 中建模的“虚拟”几何进行测试,而不是针对由 ARKit 建模的真实世界环境的稀疏估计。在这种情况下,面部网格的“虚拟”几何通过以下方式进入 SceneKit ARKit。)也就是说,你想要 <a href="https://developer.apple.com/documentation/scenekit/scnscenerenderer/1522929-hittest" rel="noreferrer noopener nofollow"><code>ARSCNView.hitTest(_:options:)</code></a> (继承自 <code>SCNSceneRenderer</code>),而不是 <code>hitTest(_:types:)</code>。当然,这意味着您需要使用 <code>ARSCNFaceGeometry</code> 来可视化场景中的面部网格,并使用 <code>ARSCNView</code> 的节点/ anchor 映射来使其跟踪面部姿势(虽然如果你想让视频图像显示出来,你可以让网格透明)——否则 SceneKitHitTest 将找不到任何 SceneKit 几何体。</p></li>
<li><p>如果您没有使用 SceneKit,或者由于某种原因无法将面部网格放入场景中,那么您将拥有重建面部网格 HitTest 所需的所有信息。 <code>ARCamera</code> 有 View 和投影矩阵,可以告诉你 2D 屏幕投影与 3D 世界空间的关系,<code>ARFaceAnchor</code> 告诉你人脸在世界空间中的位置,<code> ARFaceGeometry</code> 告诉你每个点在脸上的位置——所以它只是一个 <a href="https://gamedev.stackexchange.com/search?q=3d%20hit%20test" rel="noreferrer noopener nofollow">bunch of math</a>从屏幕点到面网格点,反之亦然。</p></li>
</ol></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在 iPhone X(SceneKit/ARKit 应用程序)上难以从 2D 区域获取面部标志点的深度,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/48155766/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/48155766/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在 iPhone X(SceneKit/ARKit 应用程序)上难以从 2D 区域获取面部标志点的深度