Получите глубину от обнаруженного лица, используя Vision и ARKit iOS

Я пытаюсь добиться чего-то вроде этого, используя Vision и ARKit, поэтому моя идея состоит в том, чтобы получить ориентиры от Vision и развернуть узел, используя эти точки. Я использую эту демонстрацию в качестве эталона. На сегодняшний день мне удалось найти ориентиры на лице с помощью Vision. Теперь, чтобы использовать эти точки в ARKit для добавления узлов в сцену. Я не могу получить глубину, которая необходима для положения узла.

После поиска SO я нашел этот пост, чтобы преобразовать CGPoint в SCNVector3, но здесь у меня есть Проблема в том, что у меня нет какой-либо опорной плоскости, которую можно использовать для получения глубины путем проверки удара.

Итак, как я могу получить идеальную глубину с помощью CGPoints, кроме использования 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");
        }
    }

Любая помощь будет здорово!


person Zღk    schedule 12.04.2018    source источник
comment
Сможете ли вы найти какое-либо решение. ?   -  person Prashant Tukadiya    schedule 12.10.2018
comment
Возможно, фиксированное расстояние от камеры + расположение других узлов?   -  person Maxim Volgin    schedule 18.10.2018