我对TrueDepth相机的数据处理问题很感兴趣。获取人脸数据,建立人脸三维模型,并将模型保存到.obj文件中是非常必要的。
由于在三维模型中需要的是人的眼睛和牙齿,所以ARKit / SceneKit是不合适的,因为ARKit / SceneKit不能填充这些区域的数据。
但是在SceneKit.ModelIO库的帮助下,我成功地以.obj格式导出了ARSCNView.scene (类型为SCNScene)。我试着把这个项目作为基础:摄像头
在这个项目中,使用TrueDepth摄像机的工作是使用金属完成的,但是如果我没有弄错的话,使用金属渲染的MTKView不是3D模型,不能作为.obj导出。
请告诉我是否有办法将MTKView导出到SCNScene,还是直接导出到.obj?如果没有这样的方法,那么如何用AVDepthData建立三维模型呢?
谢谢。
发布于 2018-10-24 21:06:37
用AVDepthData制作3D模型是可能的,但这可能不是你想要的。一个深度缓冲区就是一个像素距摄像机值的二维数组.所以你得到的唯一的“模型”不是非常三维的,它只是一张高度图。这意味着你不能从侧面看到你无法从正面看到的轮廓。(附加到WWDC 2017谈深度摄影的“使用深度数据”示例代码展示了这方面的一个示例。)
如果你想要更多真正的3D“模型”(类似于ARKit提供的东西),你需要做ARKit所做的工作--随着时间的推移,使用多种颜色和深度帧,以及一个经过训练以理解人脸的机器学习系统(以及为快速运行该系统而优化的硬件)。你可能不会觉得自己这么做是可行的选择.
可以使用model /O从ARKit中获取一个可导出的模型。您需要的代码大纲如下:
ARFaceGeometry。vertices、textureCoordinates和triangleIndices数组中创建triangleIndices。(Apple注意到纹理坐标和三角形索引数组永远不会改变,所以您只需要创建那些每次获得新帧时都需要更新的顶点。)MDLSubmesh,从子网格加上顶点和纹理坐标缓冲区创建一个MDLMesh。(可以选择使用MDLMesh函数在创建网格后生成顶点法线缓冲区。)MDLAsset并将网格添加到其中。MDLAsset导出到URL (提供具有.obj文件扩展名的URL,以便推断要导出的格式)。该序列根本不需要SceneKit (或金属,或任何显示网格的能力),这可能会被证明是有用的,这取决于您的需要。如果您确实希望涉及到SceneKit和Metal,您可能可以跳过几个步骤:
ARSCNFaceGeometry,并从人脸跟踪会话中传递给它一个ARFaceGeometry。MDLMesh(scnGeometry:)获取该几何图形的I/O模型表示,然后按照上面的步骤4-5将其导出到.obj文件。不过,不管你怎么切.如果这是一个强有力的要求建模眼睛和牙齿,没有任何苹果提供的选项会帮助你,因为他们没有做到这一点。所以,一些值得思考的东西:
leftEyeTransform/rightEyeTransform报道的以球体为中心的眼球模型作弊?blendShapes[.jawOpen]将它与脸部并排动画。)https://stackoverflow.com/questions/52953590
复制相似问题