Получить глубину от обнаруженного лица, используя Vision и ARKit iOS
Я пытаюсь достичь чего-то подобного, используя Vision
а также ARKit
так что моя идея состоит в том, чтобы получить ориентиры Vision
и развернуть узел, используя эти точки. Я использую это демо в качестве ссылки. На сегодняшний день мне удалось найти ориентиры лица, используя Vision
, Теперь, чтобы использовать эти точки в ARKit
добавить узлы на сцену. Я не могу получить глубину, которая необходима для позиции узла.
После поиска SO, я нашел этот пост для конвертации 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");
}
}
Любая помощь будет отличной!