面部表情捕获数据的转存与发送方法
【技术领域】
[0001]本发明涉及面部表情捕获数据的转存与发送方法,属于运动捕捉技术领域。
【背景技术】
[0002]随着科学技术的发展,运动捕捉技术已经在动画、电影、运动教学等领域得到了广泛的应用。运动捕捉技术是一种用于准确测量运动物体在三维空间运动状况的技术,它通过运动捕捉设备把运动物体的运动状况以数字的形式记录下来,然后使用计算机对运动数据进行处理,得到不同时间计量单位上物体的空间坐标。当前的运动捕捉技术主要包括以下几种方式:机械式运动捕捉、电磁式运动捕捉、声学式运动捕捉、光学式运动捕捉等。光学式运动捕捉具有可表演动作幅度大、无线缆和机械装置的束缚,采样速率高、精度高、系统扩充成本低等优点。因此,在动画、影视制作过程中,大多选用光学式动作捕捉系统。动作捕捉系统还可以进一步分为身体运动捕捉系统和面部表情捕捉系统,如NaturalPoint公司的OptiTrack动作捕捉系统,其中OptiTrack面部表情系统有7个运动捕捉相机,ARENAExpress1n软件可以实现真实角色面部表情的实时捕捉和发送,但面部表情系统与身体运动捕捉系统无法同时进行工作,增加了动画、影片的制作难度和周期,为此,本发明提出了一种面部表情捕获数据的转存与发送的方法,该方法只需对ARENA Express1n软件中pt2格式的文件进行一次转存操作,在发送捕捉数据时,不必打开ARENA Express1n软件对数据进行发送,只需对xml文件内的数据进行发送即可。
【发明内容】
[0003]本发明的目的在于提出了一种将面部表情数据转存及发送的方法,其可以快速地将面部表情数据不通过面部捕捉软件进行发送,从而使与面部捕捉软件发送的数据达到一致性。
[0004]本发明的技术方案是这样实现的:一种将面部表情数据转存与发送的方法,其特征在于:所需的数据结构:提供一种存储面部表情数据的数据结构,PointDada结构体包括X,Y,Z三个数据成员,FaceData结构体中包括一个PointData类型的pdata数组、一个变量Length,pdata数组中包括27个元素,FaceData定义一个指针变量,用fData表示;所需的文件:利用OptiTrack面部表情捕捉系统的7台FLEX:V100R2摄像机和ARENA Express1n软件,对某人的面部表情进行实时捕获,将捕获到的数据保存在文件face.pt2中;在计算机中,使用OptiTrack公司的提供的NatNet SDK开发包实现face.pt2文件中的面部表情数据的转存及发送,以下使用的NatNetML命名空间均来自NatNet SDK开发包,按以下步骤实现:
步骤1、在计算机中,启动ARENA Express1n软件,打开文件face.pt2,选择Stream功能,点击“StartStreamingFrame” 按钮后,ARENA Express1n 软件将文件 face.pt2 中的数据发送出去;
步骤2、定义NatNetML命名空间中的NatNetClientML类的一个对象,用m_MatNet表示,定义NatNetML命名空间中的MarkerSet类的一个对象,用ms表示,定义NatNetML命名空间中的DataDescriptor类的一个列表对象,用descs表示;
步骤3、定义NatNetML命名空间中的FrameOfMocapData类的一个对象,用m—FrameOfData表示,定义NatNetML命名空间中的FrameOfMocapData类的一个队列对象,用m—FrameQueue 表不;
步骤4、m—FrameQueue对象调用Dequeue函数,并将调用Dequeue函数得到的返回值赋给m—FrameOfDatac^如果m—FrameOfData不为空,执行步骤5,否则执行步骤4 ;
步骤5、m—MatNet调用GetDataDescript1ns函数,其中descs列表对象为GetDataDescript1ns函数的参数,如果调用GetDataDescript1ns函数得到的返回值为真,则继续执行步骤6,否则执行步骤5 ;
步骤6、定义NatNetML命名空间中的DataDescriptor类的一个对象,用md表示,在descs列表中循环获取数据赋值给md,将md对象的类型转换成NatNetML命名空间中的MarkerSet类,并赋值给ms对象;
步骤7、构造一个向量,用temp—name表示,temp—name (i)表示向量中的第i个元素,i=l,2,…,27 ;
步骤8、ms对象中的MarkerNames成员中的第i个元素赋值给temp—name [i],i=l,2,…,27 ;
步骤9、定义XmlDoucument类的一个对象,用xmlDoc表示,定义xmlNode类的一个对象,用root表示,定义xmlNode类的一个对象,用node表示;
步骤10、建立XML文件,用try表示,xmlDoc对象调用Load函数,try.xml文件名为Load函数的参数,xmlDoc对象调用CreateElement函数,字符串Root为CreateElement函数的参数,并将调用CreateElement函数得到的返回值赋给root,xmlDoc调用AppendChild函数,root对象为AppendChild函数的参数;
步骤11、定义XmlElement类的一个对象,用elem表示,xmlDoc对象调用CreateElement函数,字符串face为CreateElement函数的参数,调用CreateElement函数得到的返回值赋给elem,root对象调用AppendChild函数,elem为AppendChild函数的参数;
步骤12、定义NatNetML命名空间中的MarkerSetData类的一个对象,用mt表示,m_FrameOfData对象中的MarkerSets数组中的第I个元素赋值给mt对象;
步骤13、定义XmlDoucument类的一个对象,用elem—tmp表示,xmlDoc对象调用CreateElement函数,调用CreateElement函数得到的返回值赋给elem—tmp ;
步骤14、elem—tmp对象调用SetAttribute函数,mt对象的Makers成员中的第j个元素中的X成员为SetAttribute函数的参数,elem—tmp对象调用SetAttribute函数,mt对象的Makers成员中的第j个元素中的y成员为SetAttribute函数的参数,elem—tmp对象调用SetAttribute函数,mt对象Makers成员中的第j个元素中的z成员为SetAttribute函数的参数,elem对象调用AppendChild函数,elem—tmp为AppendChild函数的参数,j=l,2,…,27。反复执行步骤11至步骤14,直到所有m—FrameOfData对象中的数据读取完成;步骤15、xmlDox对象调用save函数,字符串try.xml为save函数的参数;
步骤16、定义XmlDoucument类的一个对象,用xml—temp表示,定义XMLElement类的3个对象,分别用root、face、elem表示,定义一个变量,用Length表示,定义一个变量,用num 表不,num=0,定义一个变量,用 MAKER—SIZEer 表不,MAKER—SIZEer=O ;
步骤17、xml—temp调用LoadFile函数,字符串try.xml为函数LoadFile的参数;步骤 18、xml—temp 调用 FirstChildElement 函数,调用 FirstChildElement 函数得到的返回值赋给 proot,proot 调用 FirstChildElement 函数,调用 FirstChildElement 函数得到的返回值赋给 pface,pface 调用 FirstChildElement 函数,调用 FirstChildElement函数得到的返回值赋给pelem,调用GetframeLength函数,调用GetframeLength函数得到的返回值赋给Length,proot为GetframeLength函数的参数;
步骤19、定义一个变量,用count表示,count=0?定义一个变量,用sizemaker表示,Sizemaker=I,定义NatNetServer类的一个指针变量,用theServer表不;
步骤20、将pelem的X、y、z成员分别赋值给fData的pdata数组中第sizemaker个元素的 X、Y、Z 成员,sizemaker=sizemaker+l? pelem 调用 NextSiblingElement 函数,调用NextSiblingElement函数得到的返回值赋给pelem,如果sizemaker等于27,继续执行步骤21,否则,重复步骤20 ;
步骤 2l、pface 调用 NextSiblingElement 函数,调用 NextSiblingElement 函数得到的返回值赋值给 pface,pface 调用 FirstChildElement 函数,调用 FirstChildElement 函数得到的返回值赋值给pelem,sizemaker=0,count=count+l,如果count等于Length,则继续执行步骤22,否则执行步骤20 ;
步骤22、定义sFrameOfMocapData类的一个对象,用frame表不,调用ZeroMemory函数,frame 为 ZeroMemory 函数的第一个参数,sFrameOfMocapData 的大小为 ZeroMemory 函数的第二个参数;
步骤23、将fData+num的pdata数组中第iMarker个元素的X成员赋值给frame下MocapData数组中的Markers 二维数组中的第iMarker行的第一个元素,将fData+num指针的pdata数组中第iMarker个元素的Y成员赋值给frame下MocapData数组中的Markers二维数组中的第iMarker行的第二个元素,将fData+num指针的pdata数组中第iMarker个元素的Z成员赋值给frame下MocapData数组中的Markers 二维数