Как измерить расстояние устройства от лица с помощью ARKit в iOS?
Мне нужно создать приложение, в котором мы хотим измерить расстояние между устройством и моим лицом пользователя. Я думаю, что это возможно с помощью ARKit, но я не знаю, как это сделать. Есть ли образец или пример?
2 ответа
Если вы используете ARFaceTrackingConfiguration (только для iPhone X), есть как минимум два способа добиться этого (я думаю, что второй вариант лучше).
Первый способ
Вы можете использовать глубину данных ИК камеры:
yourARSceneView.session.currentFrame?.capturedDepthData?.depthDataMap
Это вернет CVPixelBuffer размером 640x360, содержащий данные глубины для каждого пикселя (в основном, расстояние между ИК-камерой и реальными объектами в мире). Вы можете получить доступ к данным CVPixelBuffer через доступные расширения, подобные этому. Данные глубины выражены в метрах. Получив данные о глубине, вам нужно будет выбрать или определить, какие из них являются частью лица пользователя. Вы также должны быть осторожны, что "камера, измеряющая глубину, предоставляет данные с частотой кадров, отличной от цветовой камеры, поэтому значение этого свойства также может быть равно нулю, если данные о глубине не были получены одновременно с текущим цветным изображением". Для получения дополнительной информации: AVDepthData
Второй метод (рекомендуется)
Другой способ получить расстояние между устройством и лицом пользователя - преобразовать положение обнаруженного лица пользователя в систему координат камеры. Чтобы сделать это, вам нужно будет использовать метод convertPosition из SceneKit для переключения координатного пространства с координатного пространства лица на координатное пространство камеры.
let positionInCameraSpace = theFaceNode.convertPosition(pointInFaceCoordinateSpace, to: yourARSceneView.pointOfView)
theFaceNode
это SCNNode, созданный ARKit, представляющий лицо пользователя. pointOfView
собственность вашего ARSCNView
возвращает узел, с которого просматривается сцена, в основном камера. pointInFaceCoordinateSpace
могут быть любые вершины сетки лица или просто положение theFaceNode
(которая является источником системы координат лица). Вот, positionInCameraSpace
это SCNVector3
, представляющий положение заданной вами точки в пространстве координат камеры. Затем вы можете получить расстояние между точкой и камерой, используя значения x,y и z этого SCNVector3 (выраженные в метрах).
Я думаю, что второй метод лучше, так как он выглядит более точным, и вы можете точно выбрать, какую точку лица вы хотите измерить. Вы также можете использовать преобразования, как сказал Rom4in (я думаю, что метод convertPosition использует преобразования). Надеюсь, это поможет, и мне также любопытно узнать, есть ли более простые способы добиться этого.
И камера, и лицо имеют трансформации, вы можете рассчитать расстояние между ними.
Я сделал это с помощью метода рендеринга (didUpdate) в библиотеке ARKit, а затем вы можете сохранить все это в переменной или записать в файл. Здесь я храню все данные в такой переменной,
func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor)
{
var data = "\(Date().timeIntervalSince1970 * 1000),\ (node.position.x),\(node.position.y),\(node.position.z)\n"
}