RIA 使技术变得有趣起来,比如CAD,Matlab等工具,未来非常适合直接以RIA方式在线运行。技术转型后,给自己的技术方向定的很窄,RIA这一块也只 关注在线图形图像应用,如在线试戴、试穿、试用、试装修等功能。试发系统已经做了好几套了,当然主要还是借鉴国外的系统taaz和thehairstyles,下面简析一下发型试戴的原理。
发型试戴的两个核心问题:
(1)如何让千奇百怪的发型自动戴在千奇百怪的模特头上,戴在正确的位置上?
(2)戴上之后,用户如何调整发型?不仅仅限于放大,缩小,上下左右挪动,而是“自由”变形。
====
问题1的解决方案:
这是taaz的解决方案。假定一个标准的模特S,脸上有6个坐标点,见图:
根据5,6两点,可以求出它的中点7:
由点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确定了标准模特和用户上传模特的仿射变换。
关于仿射变换,这里有一篇文章给了很直观的解释。
对于发型,由于有人脸大,有人脸小,有人脸宽,有人脸窄,因此使用的是另一个定位三角形:
使用上图中的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液化工具箱中向前变形工具》),我是这样干的:
对比来说,TPS更好用一些,局部变形做细微调整的能力更强一点。