使用Vision和ARKit iOS从检测到的脸部获取深度

时间:2018-04-12 04:53:06

标签: objective-c swift arkit masking apple-vision

我正在尝试使用VisionARKit来实现this之类的内容,所以我的想法是从Vision获取标志性点并使用这些点部署节点。我使用this demo作为参考。到目前为止,我已经能够使用Vision找到脸部的标志性点。现在使用ARKit中的这些点向场景添加节点。我无法获得深度,这对节点的位置至关重要。

搜索完SO后,我发现this post要将CGPoint转换为SCNVector3,但我在这里遇到问题,因为我没有任何可以使用的参考平面通过命中测试获得深度。

那么,除了使用CGPoint之外,我怎样才能使用hitTest获得完美的深度,或者还有其他方法可以实现视频中显示的结果。

以下是实施的代码

            CGPoint faceRectCenter = (CGPoint){
            CGRectGetMidX(faceRect),CGRectGetMidY(faceRect)

        }; // faceRect is detected face bounding box

        __block NSMutableArray<ARHitTestResult* >* testResults = [NSMutableArray new];

        void(^hitTest)(void) = ^{


            NSArray<ARHitTestResult* >* hitTestResults = [self.sceneView hitTest:faceRectCenter types:ARHitTestResultTypeFeaturePoint];
            if(hitTestResults.count > 0){
                //get the first
                ARHitTestResult* firstResult = nil;
                for (ARHitTestResult* result in hitTestResults) {
                    if (result.distance > 0.10) {
                        firstResult = result;
                        [testResults addObject:firstResult];
                        break;
                    }
                }
            }
        };

        for(int i=0; i<3; i++){
            hitTest();
        }

        if(testResults.count > 0){
            NSLog(@"%@", testResults);
            SCNVector3 postion = averagePostion([testResults copy]);
             NSLog(@"<%.1f,%.1f,%.1f>",postion.x,postion.y,postion.z);

            __block SCNNode* textNode = [ARTextNode nodeWithText:name Position:postion];
            SCNVector3 plane = [self.sceneView projectPoint:textNode.position];
            float projectedDepth = plane.z;
            NSLog(@"projectedDepth: %f",projectedDepth);


            dispatch_async(dispatch_get_main_queue(), ^{
                [self.sceneView.scene.rootNode addChildNode:textNode];
                [textNode show];
            });
        }
        else{
           // NSLog(@"HitTest invalid");
        }
    }

任何帮助都会很棒!!

0 个答案:

没有答案