gpt4 book ai didi

ios - CATransform3D 能否用于获取面部网格中的眼睛大小尺寸?

转载 作者:搜寻专家 更新时间:2023-10-30 23:04:26 25 4
gpt4 key购买 nike

我正在尝试使用 ARKit 的 3D 面部网格获取眼睛的宽度和两只眼睛的距离。

我使用了ARAnchorCATransform3D

 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 也是如此。

所以我的问题是这些值是否指定了任何尺寸或尺寸测量值?

我可以计算眼睛的宽度和两只眼睛之间的距离吗?

非常感谢任何帮助。

最佳答案

So my question is do these values specify any dimension or size measurement?

没有。你得到的数字是胡说八道,因为你得到它们的方式是……也许不是胡说八道,但非常接近。

blendShapes ARFaceAnchor 上的字典记录为具有 NSNumber 类型的值,其中 NSNumber 的基础数值是介于 0.0 和 1.0 之间的 float 。

NSNumber是许多可能类型的标量数值的对象包装器。它具有将其基础值作为各种类型获取的方法(通过转换为相同数字的不同表示)。但鉴于这些特定数字被记录为介于 0 和 1 之间的浮点值,因此获取 intValueboolValue 等没有多大意义。

NSNumberNSValue 的子类,它是许多种类的对象包装器,这些类型不能以其他方式表示为对象——范围、大小、指针和 3D 变换矩阵等。这些类型不能像数字那样相互转换,因此从 NSValue 中提取的唯一有意义的类型是它创建时使用的类型。任何其他类型都会让你胡说八道。

返回blendShapes - 进一步记录了字典中的每个混合形状值不仅仅是一个数字,而是一个告诉你动画参数进度的数字。 eyeBlinkLeft并没有声称会告诉您任何关于左眼的位置或大小的信息——它会告诉您左眼睑“眨眼”(闭合)的程度。

你找错了树,但如果你查看你正在使用的类和属性的文档,你以后就能更好地做出有根据的猜测。

Can I calculate width of the eyes and distance between two eyes?

更新:在“ARKit 2”(iOS 12 中的 ARKit)中,leftEyeTransformrightEyeTransform提供每个眼球中心的 3D 位置(相对于面部 anchor )。 (还有每只眼睛的方向。)这可能对您的用例有帮助,但如果您实际需要的是与瞳孔或眼睛开口的位置/大小有关...

没有 API 可以为您执行此操作。 ARKit 确实提供了您可以用来自己找到它的信息,但并不能保证始终有效。

ARFaceGeometry给你一个三角形网格,它以一种在 session 中拓扑稳定的方式在脸上映射几百个左右的点。也就是说,例如,假设网格中的第 57 个顶点是鼻尖,即使面部皱纹和拉伸(stretch)以及该点相对于其他点的位置发生变化,它也会留在鼻尖上。

问题:

  • API 不会告诉您哪些顶点(网格中的点)是哪些(就眼角、鼻尖等面部特征而言)。
  • 网格的拓扑结构在一个 session 中是稳定的,但 Apple 不保证它不会在 iOS 版本、设备等之间发生变化。

因此,尽管进行一些实验,您也许能够找出哪些顶点是左眼的内角、左眼的外角等。一旦您这样做了,您就可以查看它们的位置来估计有用的眼宽、瞳孔间距等数量。但是,这些测量值是基于可能并不总是适用的网格假设,因此您不知道应用程序的用户何时会中断。

关于ios - CATransform3D 能否用于获取面部网格中的眼睛大小尺寸?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50286403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com