Можно ли использовать CATransform3D для получения размеров глаз в Face Mesh? - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь определить ширину глаз и расстояние до 2 глаз, используя 3D Face Mesh от ARKit.

Я использовал CATransform3D из ARAnchor ;

 struct CATransform3D
{
  CGFloat m11, m12, m13, m14;
  CGFloat m21, m22, m23, m24;
  CGFloat m31, m32, m33, m34;
  CGFloat m41, m42, m43, m44;
};

Ниже приведен мой код;

func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {

guard let faceAnchor = anchor as? ARFaceAnchor else { return }

let leftcaTransform3DValue : CATransform3D = (faceAnchor.blendShapes[.eyeBlinkLeft]?.caTransform3DValue)!

let rightcaTransform3DValue : CATransform3D = (faceAnchor.blendShapes[.eyeBlinkRight]?.caTransform3DValue)!

print("  m11 : \(String(describing:leftcaTransform3DValue.m11)) m12 : \(String(describing:leftcaTransform3DValue.m12)) m13 : \(String(describing:leftcaTransform3DValue.m13)) m14 : \(String(describing:leftcaTransform3DValue.m14)) m21 : \(String(describing:leftcaTransform3DValue.m21)) m22 : \(String(describing:leftcaTransform3DValue.m22)) m23 : \(String(describing:leftcaTransform3DValue.m23)) m24 : \(String(describing:leftcaTransform3DValue.m24)) m31 : \(String(describing:leftcaTransform3DValue.m31)) m32 : \(String(describing:leftcaTransform3DValue.m32)) m33 : \(String(describing:leftcaTransform3DValue.m33)) m34 : \(String(describing:leftcaTransform3DValue.m34)) m41 : \(String(describing:leftcaTransform3DValue.m41)) m42 : \(String(describing:leftcaTransform3DValue.m42)) m43 : \(String(describing:leftcaTransform3DValue.m43)) m44 : \(String(describing:leftcaTransform3DValue.m44)) " )
}

И в результате leftcaTransform3DValue Я получил такие значения, как;

m11 =  -5.22553711590422e-315
...
...
...
m44 =   2.13285635582599e-314

То же самое для rightcaTransform3DValue .

Итак, мой вопрос заключается в том, указывают ли эти значения какие-либо измерения или измерения размера?

Можно ли рассчитать ширину глаз и расстояние между двумя глазами?

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 13 мая 2018

Итак, мой вопрос: эти значения определяют какие-либо измерения или измерения размера?

Нет. Цифры, которые ты получаешь, бессмысленны, потому что способ, которым ты их получаешь ... может быть, не совсем глупость, но довольно близко.

Словарь blendShapes в ARFaceAnchor задокументирован как имеющий значения типа NSNumber, где базовое числовое значение NSNumber является Float между 0,0 и 1,0.

NSNumber - это обертка объекта для многих возможных типов скалярных числовых значений. У него есть методы для извлечения его базового значения в виде различных типов (путем преобразования в другое представление одного и того же числа). Но учитывая, что эти конкретные числа задокументированы как значения с плавающей точкой от 0 до 1, нет особого смысла извлекать intValue или boolValue и т. Д.

NSNumber является подклассом NSValue, который является оберткой для многих видов типов, которые иначе не выражаются как объекты - диапазоны, размеры, указатели и трехмерные объекты. преобразовать матрицы, среди других. Эти типы не могут быть преобразованы между собой, как числа, поэтому единственный тип, который имеет смысл извлечь из NSValue, - это тип, с которым он был создан. Любой другой тип дает вам глупость.

Назад к blendShapes - далее документально подтверждено, что каждое значение фигуры наложения в словаре - это не просто число, а число, которое сообщает вам о прогрессе параметра анимации. eyeBlinkLeft не претендует на то, чтобы рассказать вам о том, где или насколько велик левый глаз - он говорит о том, насколько «моргнуло» (закрыто) левое веко.

Вы лаете не по тому дереву, но если вы посмотрите на документы по тем классам и свойствам, которые вы используете, у вас будет больше возможностей сделать обоснованные догадки позже.

Можно ли рассчитать ширину глаз и расстояние между двумя глазами?

Обновление: В «ARKit 2», также известном как ARKit в iOS 12, leftEyeTransform и rightEyeTransform обеспечивают трехмерное положение (относительно якорь лица) центра каждого глазного яблока. (Также ориентация каждого глаза.) Это может помочь вашему варианту использования, но если то, что вы на самом деле ищете, имеет отношение к положению / размеру зрачков или глазным отверстиям ...

Нет API, который сделал бы это для вас. ARKit предоставляет информацию, которую вы можете использовать, чтобы узнать ее самостоятельно, но не так, чтобы она всегда работала.

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

Проблемы:

  • API не сообщает вам, какие вершины (точки в сетке) есть какие (с точки зрения ориентиров лица, таких как угол глаза, кончик носа и т. Д.).
  • Топология сетки стабильна в течение сеанса, но Apple не гарантирует, что она не изменится между версиями iOS, устройствами и т. Д.

Итак, хотя в результате некоторых экспериментов вы сможете определить, какие вершины являются внутренним углом левого глаза, внешним углом левого глаза и т. Д. Как только вы это сделаете, вы можете посмотреть на их положения, чтобы оценить полезность такие величины, как ширина глаза, расстояние между зрачками и т. д. Однако эти измерения основаны на предположениях о сетке, которая может не всегда сохраняться, поэтому вы не знаете, когда она сломается для пользователей вашего приложения.

...