我正在使用 iPhone X 上的前置摄像头运行面部标志检测,并且正在努力获取面部标志的 3D 点(VNFaceLandmarkRegion2D 仅提供图像坐标 X、Y)。
我一直在尝试使用ARSCNView.hitTest
or ARFrame.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
捕捉前置摄像头的画面(如果这很重要)。
任何帮助将非常非常感谢,非常感谢!
- 解决了 -
对于任何有类似问题的人:
我终于得到了命中测试结果!
for point in observation.landmarks?.allPoints?.pointsInImage(imageSize: sceneView.bounds.size) {
let result = ARSCNView.hitTest(point, options: [ARSCNHitTestOption.rootNode: faceNode)
}
我使用面几何体作为附加到面节点的遮挡节点。
谢谢里克斯特!