--html
图3.面部对齐。左:检测到面部标志和凸包。中:凸包上的点的Delaunay三角剖分。右:经过仿射扭曲三角形进行面部对齐。python
1 人脸对齐c++
1.1 脸部地标检测less
两个脸部的几何形状很是不一样,所以咱们须要对源脸部进行一些扭曲以使其覆盖目标脸部,可是咱们还想确保咱们不会使其扭曲而没法识别。函数
首先使用dlib在两个图像上检测面部标志。可是,与“ 脸部变形”不一样,咱们不也不该使用全部点进行脸部对齐。spa
咱们只须要如图所示的人脸外边界上的点便可。code
1.2 查找凸包
在计算机视觉和数学术语中,点或形状的集合的边界称为“包”。没有任何凹面的边界称为“凸壳”。orm
在图3中,左图显示了使用dlib检测到的脸部界标为红色,点的凸包显示为蓝色。htm
一组点的凸包可使用OpenCV的concealHull函数来计算。blog
python:
# points is numpy array of points obtained # using dlib. hullIndex = cv2.convexHull(points, returnPoints = False) # hullIndex is a vector of indices of points # that form the convex hull.
c++:
vector<int> hullIndex; // points is of type vector<Point2f> obtained // using dlib. convexHull(points, hullIndex, false, false); // hullIndex is a vector of indices of points // that form the convex hull.
1.3 Delaunay三角剖分
对齐的下一步是对凸包上的点进行Delaunay三角剖分。在图3的中间图像中显示了三角剖分。
这使咱们能够将脸部分红较小的部分。我之前的文章详细解释了Delaunay三角剖分,请参见此处
1.4 仿射扭曲三角形
进行面对齐的最后步骤,以考虑源脸部和目标脸部之间的对应三角形,并将源脸部三角形仿射扭曲到目标脸部上。
有关个人脸部变形的更多信息,请参见个人文章。
可是,如您在图3的右图中所看到的,对齐面部并将一个面部拍打在另外一面部的上方看起来并不天然。
因为两个图像之间的光照和肤色差别,能够看到接缝。下一步显示如何无缝地组合两个图像。
2 无缝克隆
好的技术思想就像是魔术。优秀的魔术师结合了物理,心理学和良好的旧手技巧来达到使人难以置信的效果。
仅图像扭曲看起来就很糟糕。将其与Seamless Cloning结合使用,结果是神奇的!我写了一篇文章,解释的细节在这里。
这是OpenCV 3中的一项功能,可以让您无缝地将源图像的一部分(由掩码标识)克隆到目标图像上。
python:
output = cv2.seamlessClone(src, dst, mask, center, cv2.NORMAL_CLONE)
c++:
seamlessClone(src, dst, mask, center, output, NORMAL_CLONE);
上面用法中的src图像如图3所示。(右图)。的DST图像是其上咱们要混合源图像(即特朗普的图像)的图像。
经过使用fillConvexPoly用白色填充凸包来计算蒙版,而且中心是包含蒙版的边界框的中心。
总结:
脸部地标检测(Facial Landmark) 点
查找凸包(Convex Hull ) 面
Delaunay三角剖分(Delaunay Triangulation )
仿射扭曲三角形(源脸部三角形仿射扭曲到目标脸部)(Affine warp triangles )
无缝克隆(Seamless Cloning)
--