t0nyren / piecewiseAffine

99 stars 26 forks source link

Background

严格来说,无论是仿射变化(affine transformation)还是图像变形(image warping)其实都不能算在计算机视觉(computer vision)的范畴内,而应该属于计算几何(computational geometry)。自己学习计算几何已经是研究生时候的事情,课程更偏向于对诸如Convex hull, Delaunay triangulation, Voronoi diagram等问题的formulation, algorithm design和complexity analysis,几乎没有涉及任何实际的应用场景。最近研究了Brown University的Computational Photography课程,才发现利用简单的geometry便可以做出各种有意思的图像应用,比如在人脸方面:

人脸变形简介

简单来说,Affine transformation做的事情就是就是将一个图形映射到另一个位置,在映射过程中图形本身的大小,形状可能发生变化,但仍然保留着图形内部点与点之间的位置关系。如下图所示,正方形ABCD通过变换成为梯形ABCD,而内部的两点x,y之间的相对位置并没有发生改变。 drawing 利用这一点,我们可以将人脸分割成许多小的三角形(因为三角形是可以定义闭合空间的拥有最少顶点的形状),然后利用改变这些三角形及其邻近三角形的位置和大小,达到变形的效果。因此,大部分的人脸变形都可以分为以下几个步骤:

  1. Landmark detection: 检测并且标定脸部得landmarks,如眉毛,眼睛,鼻子,嘴,轮廓等等。
  2. Triangulation: 基于检测出的landmarks将人脸区域分割为多个三角形。
  3. Affine transformation: 对这些三角形进行仿射变换,投影到新的位置。
    • Face morphing, 3D矫正:将参考人脸(reference)以及需要变换的目标人脸(target)都进行triangulation,将目标人脸上的三角形与参考人脸上的三角形的大小与位置一一对应,再一个一个通过仿射变换映射过去。
    • 平均脸: 和矫正相似,首先对所有照片上的人脸标定,然后求出每个landmark的平均位置,再对这些平均位置做triangulation得到参考脸(reference)。最后将所有照片进行triangulation,全部统一映射到参考脸上三角形的位置。

Step 1:Landmark detection

我对Landmark detection的技巧还没有深入研究,最传统的做法是基于Active Appearance Model (AAM)或是Active Shape Model(ASM)的。现在对landmark detection作的比较好的几个机构有:

Face++

CMU Human Sensing Lab: Intraface

Step 2:Delaunay Triangulation

Delaunay Triangulation是一种最常见的利用参考点(reference point)将平面分割成三角形的方法。Delaunay Triangulation的标准定义如下: "A Delaunay triangulation for a set P of points in a plane is a triangulation DT(P) such that no point in P is inside the circumcircle of any triangle in DT(P). " DT的一个重要特性是,它最大化了所有三角形中最小的角度(maximized the minimum angles in all triangles),因此在使用DT得到的三角形做仿射变换可以防止过大的角度变化而造成的失真。 计算DT的算法:DT并不是一个NP-hard的问题,有许多高效的算法可以解DT,其中最著名的是Lee and Schachter's algorithm,达到了O(nlogn)的time complexity。值得一提的是,由于DT是Voronoi Diagram的dual graph,所以著名的Fortune's algorithm也可以用来求解DT。 drawing

Step 3:Affine Transformation

math

代码

基于OpenCV的Delaunay Triangulation [ C++ ]

3D Alignment [ C++ ]

平均脸:[ matlab ]