发型试戴原理简析

RIA 使技术变得有趣起来,比如CAD,Matlab等工具,未来非常适合直接以RIA方式在线运行。技术转型后,给自己的技术方向定的很窄,RIA这一块也只关注在线图形图像应用,如在线试戴、试穿、试用、试装修等功能。试发系统已经做了好几套了,当然主要还是借鉴国外的系统taazthehairstyles,下面简析一下发型试戴的原理。

发型试戴的两个核心问题:

(1)如何让千奇百怪的发型自动戴在千奇百怪的模特头上,戴在正确的位置上?

(2)戴上之后,用户如何调整发型?不仅仅限于放大,缩小,上下左右挪动,而是“自由”变形。

====

问题1的解决方案:

这是taaz的解决方案。假定一个标准的模特S,脸上有6个坐标点,见图:

 

image

 

根据5,6两点,可以求出它的中点7:

image

 

由点1,4,7构成一个三角形S(1,4,7)。

用户上传自己的头像U,也需要指定1-6点的坐标,由此也可以算出7点的坐标。U(1,4,7)构成另一个三角形。算出 S(1,4,7)=>U(1,4,7) 的仿射变换ASU。ASU确定了标准模特和用户上传模特的仿射变换。

关于仿射变换,这里有一篇文章给了很直观的解释

对于发型,由于有人脸大,有人脸小,有人脸宽,有人脸窄,因此使用的是另一个定位三角形:

image

 

使用上图中的8,9,10三点进行定位。对于标准模特S,可以测量得出它的8,9,10三点构成的三角形 S(8,9,10)。对于每个发型H,我们也指定一下以上三点,构成三角形H(8,9,10)。

计算H(8,9,10)=> S(8,9,10)的仿射变换AHS。AHS实现了发型图像到标准模特脸上的仿射变换。

如此一来,对于一个发型H,做两次仿射变换——ASU(AHS(H)),即可将发型戴于用户自己的头像U上。这个映射可以让发型正确“找到”自己的位置。

====

问题2的解决方案:

如果想更精细的调整发型试戴的效果,可在发型位置增加一些控制点,使用TPS样条实现变形效果,taaz是这样做的。TPS样条见我的博文 《TPS(薄板样条) 2D 插值》,这里贴张图:

TPS更详细的描述及算法见F.L. Bookstein, "Principal Warps: Thin-Plate Splines and the Decomposition of Deformations,"

也可以使用局部变形算法(见:《图像变形算法:实现Photoshop液化工具箱中向前变形工具》),我是这样干的:

image  image  image

对比来说,TPS更好用一些,局部变形做细微调整的能力更强一点。

posted @ 2010-08-19 07:41  xiaotie  阅读(5339)  评论(10编辑  收藏  举报