赞
踩
关于换脸的什么背景什么的,我也就不提了,直接说一下换脸所需要的步骤吧,在这里我用的是opencv和之前我用的CLM框架,CLM还是进行人脸关键点检测,利用opencv进行脸部替换和颜色风格统一。
接下来是利用opencv换脸的一般步骤:
1.脸部对齐:也就是把前一个人的脸的部分分割出来覆盖到下一个人的脸的地方。如下图:
脸部关键点检测
因为我们要变换的两张脸的形状一般是不同的,所以我们需要对原始的脸进行一个变形,但是在变形后我也不希望脸部变得无法识别,所以我们首先用CLM进行面部关键点检测。在这里我们需要注意的仅仅只有面部的边界点。
2.寻找面部凸包
凸包的概念在opencv中有,在这里就是将边界点顺序相连形成多边形。
- 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.
3.三角剖分
这个步骤就是利用面部边界点进行三角剖分。通过这种方式将面部区域细分乘多个微小区域。
4.三角形的仿射变换
之前提到了,我们需要覆盖的脸部很多都是不一样形状的,所以在这里我们要根据这些三角区域进行仿射变换,最终能够合理的覆盖到原始脸部。
无缝克隆
上面我们变换之后会发现颜色很尴尬,一点都不和谐,在这种情况下,我们就需要用到opencv里面的seamlessclone这个函数,这个函数的效果就是使得mask内的区域色调什么的尽可能和边界之外的部分保持一致。
seamlessClone(src, dst, mask, center, output, NORMAL_CLONE);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。