使用opencv的人脸变形
我想知道如何在实时视频中使用opencv来变形人脸。我试过了人脸替换,但那个是用openFrameworks实现的。
我想用opencv来实现同样的功能。除了直接把人脸替换的代码从openFrameworks移植到opencv,还有其他方法吗?
我也看过这个链接,但有些人提到人脸变形在opencv中已经被弃用了?
4 个回答
0
查看一个用Python和OpenCV制作的人脸变形工具
1
下面是使用网格变形算法实现人脸变形的步骤(你可以用opencv
或者Python的scipy
/ scikit-image
来实现):
- 定义对应点:找到需要对齐的人脸之间的对应点,使用面部特征点(可以用
dlib
来检测这些特征点)。 - 德劳内三角剖分:你需要提供这些点的三角剖分(比如德劳内三角剖分),这个会用于变形(可以用
scipy.spatial
里的Delaunay
)。 - 计算中间(变形)人脸:计算平均形状,把两张脸都变形到这个形状上(使用源图像中的三角形和变形图像中对应的三角形来计算仿射变换,然后对三角形内的点进行变形,最后将变形后的图像进行混合,得到最终的变形图像,可以用
scikit-image
的warp()
)。
接下来的动画展示了使用网格变形算法在Python中用scipy
/ numpy
/ scikit-image
实现的动画效果(从《蒙娜丽莎》到达芬奇的图像的变形序列)。你也可以在这里找到这个视频。
另一个流行的算法是Beier-Neely变形算法(https://en.wikipedia.org/wiki/Beier%E2%80%93Neely_morphing_algorithm)
11
我最近写了一篇关于使用OpenCV进行人脸变形的文章。我分享了C++和Python的代码。你可以在这里找到详细信息:
http://www.learnopencv.com/face-morph-using-opencv-cpp-python/
基本的思路如下:
- 首先,在两张输入图片中找到对应的点。
- 对这些点进行德劳内三角剖分。
- 变形的程度由一个叫做alpha的参数控制。比如,当alpha = 0时,你会得到下面例子中的Ted Cruz,而当alpha = 1时,你会得到Hillary Clinton。对于其他的alpha值,结果就是两者的混合。使用alpha来计算输出(变形后)图像中点的位置,通过对两张输入图像中的点进行加权平均。
- 计算输入图像中每个三角形与目标图像(变形后的图像)之间的仿射变换。
- 将每个输入图像中的三角形扭曲到输出图像中,并根据alpha值混合像素。对每个三角形都这样做,你就能得到最终的变形图像。
希望这对你有帮助。