Как измерить расстояние устройства от лица с помощью ARKit в iOS? - PullRequest
0 голосов
/ 27 июня 2018

Мне нужно создать приложение, в котором мы хотим измерить расстояние между устройством и моим лицом пользователя. Я думаю, что это возможно с помощью ARKit, но не знаю, как это сделать. Есть ли образец или пример?

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Если вы используете 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 использует преобразования). Надеюсь, это поможет, и мне также любопытно узнать, есть ли более простые способы добиться этого.

0 голосов
/ 29 июня 2018

Как камера, так и лицо имеют преобразования, вы можете рассчитать расстояние между ними.

...