Candide模型是一个没有纹理贴图的标准模型,为了得到逼真的人脸模型,必须对其进行变形,并进行纹理贴图。由于Candide模型是一个前半部脸的模型,以及OpenGL有强大的拾取功能,因此提出了一种只使用一张正面照片即可生成特定人脸模型的方法。
1.OpenGL的拾取功能介绍
应用OpenGL不仅可以控制物体的绘制,还可以对物体进行标记,以及区分在指定区域上绘制了哪些物体以及返回绘图信息。绘图模式、选择模式、反馈模式构成了OpenGL开发三维图形的基础。绘图模式中,物体的机会参数、光照与材质参数、纹理参数等构成了交互式程序的绘制基础。选择模式为用户提供了一种拾取物体的机制,反馈模式将绘图信息加以组织,并返回给应用程序,成为程序设计的重要资料和用户所需的信息。
在反馈模式下,每个被光栅化的图元均产生一组数据,并由OpenGL将它们存放入反馈数组中。每个数组均有一个标记,该标记说明了基元的类型,接着是描述基元的顶点坐标值、颜色和纹理等信息。在退出反馈模式之后,这些数据就被写入反馈数组中。
与选择模式相同的是,反馈模式不对像素作任何光栅化操作,也不向帧缓存写入任何绘图信息,因而在应用反馈模式之前,必须绘制一次需要反馈信息的物体。
应用反馈模式的基本步骤:
1)确定反馈信息的信息类别和反馈数组,通过glFeedbackBuffer()函数来完成。
2)将glRenderMode()函数的参数设置为GL—FEEDBACK,使OpenGL进入反馈模式。
3)重新绘制物体,并按要求插入标记。
4)反馈数组的建立。
建立反馈数组的glFeedbackBuffer函数如下:
void glFeedbackBuffer(GLsizei size,GLenum type,Glfloat*buffer);其中,size:表示能够写进反馈数组的数据的最大个数;type:定义返回数据的类型,取值含义见表11-9。
表11-9 type取值含义
2.人脸模型变形
本书应用OpenGL的反馈模式,使用鼠标选择特征点,并移动到照片的实际位置,这样就可以从一张二维的照片中获取特征点(即控制点)的三维数据,以及纹理坐标数据。
本书对11.3.2节所述算法进行了改进,提高了算法的效率,并大大压缩了计算变形所耗用的时间。其改进如下:(www.xing528.com)
1)由于Candide模型是相对通过鼻尖、下巴尖的竖直轴严格对称的,并且需要变形的部位和数据也都相对该轴严格对称,所以可以只对左半脸或右半脸应用Dirichlet自由变形算法,然后根据对称轴以及变形的位置计算出另外一半的变形数据,这样将数据量压缩了一半,大大节省了控制点的设计所费时间以及运算耗费的时间。
图11-29 功能域的划分
2)在控制点的设计上,人的脸部变化是由多个器官共同作用实现的,人脸的不同器官变形的幅度与形状各不相同,所以需要根据器官定义不同的控制域。本书参考MPEG-4的FDP分组方式对Candide模型进行了控制区域划分,如图11-29所示。由于DFFD算法只考虑了点的空间位置,没有考虑点的连接关系,所以在人脸变形时,会产生一些不希望的变形。为了避免这种情况的发生,将控制点分为三层来处理。Level1为全局控制点,Level2、Level3为各个器官的控制点。属于Level1的控制点运动将导致Level2控制点的位置移动。而Level2、Level3控制点的移动共同决定器官上其他点的运动。
3)为了加强或减弱某些Sibson邻居对三维空间点的运动影响,本书给Sibson坐标的分量赋予权值wi,由此得到加权的DFFD算法为
4)此外,为了加快对控制点的选择以及权值的确定,引入了直接自由变形的思想。直接变形算法的变形过程与DFFD算法的刚好相反,其核心思想是:选择物体上的一个点,将该点移至所要求的位置,反算出控制顶点的位置变化,并计算物体上其他的点。该算法求解过程需要计算矩阵的广义逆矩阵。为了避免求解广义逆矩阵,本书对该算法加以改进,并与DFFD算法相融合,取得了较好的效果。该方法如下:利用OpenGL的拾取功能,在开始特征点(即本书所述的控制点)的选择时,每个区域多选择一个非特征点,记录该点的数据。然后利用该点数据,形成一个闭合反馈,不断调整控制点以及权值分量,直到满足所设定的阈值。采用这种方式,避免了盲目地选择控制点,大大缩短了控制点设计时间。该算法流程如图11-30所示。
实验结果如图11-31所示。其中,图a为原始模型,图b为输入模型,图c为变形后的特定人脸模型,可以看出还有一些细微的差异,大致与输入照片一致,可以通过进一步修改控制点和权值,使其更接近真实人脸。
图11-30 求解控制点及权值的算法流程
然后,根据先前选取特征点所获得的纹理坐标及得到的特定人脸模型的顶点坐标,在XY平面投影,计算其他特征点的纹理坐标,并进行纹理贴图,结果如图11-32所示。最后将模型数据输入到.obj文件,便于其他模块的工作以及重复性的读取。
图11-31 实验结果
a)原始模型 b)输入模型 c)特定人脸模型
图11-32 纹理贴图
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。