这是一个非常有意思的应用,可以将一个人的脸逐渐过渡为另一个人的脸。花了大概1天完成了最基本的功能,大概3天去完善它,可能还有不少bug等着我去修改,不过先把目前的进展记录下来吧。
图形库:CImg
环境:Win10、C++11、VS2013
效果图一:
效果图二:
思路:
1) 分别对图像A和图像B采集控制点(坐标)
2) 利用Delaunay算法划分三角形,保证图像A和图像B的三角形一一对应且不重合。
3) 计算每对三角形的过渡三角形,过渡量为0~1。
4) 计算三角形到三角形的仿射变换矩阵。
5) 利用变换矩阵分别将图像A和图像B变换到过渡三角形网格。
6) 利用过渡量计算合成图的像素色彩。
我觉得难点主要在于 Delaunay算法 和 Affine Transformation矩阵计算,其次是应用的鲁棒性增强。由于目前还没有学习人脸识别的相关技术,所以还需要人为标定控制点,做一些“Dirty Work”。因此我也把工程分为了两个:一是主工程,专门负责已经三角分割后的图像处理。二是辅助工程,专门负责控制点的采集以及三角分割。可以这么说,主工程的核心是Morphing,辅助工程的核心是Delaunay。
先看看辅助工程吧,事先定义好了常用的结构体后,就可以写Delaunay算法了。Delaunay分割的准则是:任何三角形ABC,不存在一点D,在其外接圆内。考虑到人脸的控制点数量一般在低两位