使用opencv的人脸变形

7 投票
4 回答
9886 浏览
提问于 2025-04-18 09:33

我想知道如何在实时视频中使用opencv来变形人脸。我试过了人脸替换,但那个是用openFrameworks实现的。

我想用opencv来实现同样的功能。除了直接把人脸替换的代码从openFrameworks移植到opencv,还有其他方法吗?

我也看过这个链接,但有些人提到人脸变形在opencv中已经被弃用了

4 个回答

0

查看一个用Python和OpenCV制作的人脸变形工具

1

下面是使用网格变形算法实现人脸变形的步骤(你可以用opencv或者Python的scipy / scikit-image来实现):

  1. 定义对应点:找到需要对齐的人脸之间的对应点,使用面部特征点(可以用dlib来检测这些特征点)。
  2. 德劳内三角剖分:你需要提供这些点的三角剖分(比如德劳内三角剖分),这个会用于变形(可以用scipy.spatial里的Delaunay)。
  3. 计算中间(变形)人脸:计算平均形状,把两张脸都变形到这个形状上(使用源图像中的三角形和变形图像中对应的三角形来计算仿射变换,然后对三角形内的点进行变形,最后将变形后的图像进行混合,得到最终的变形图像,可以用scikit-imagewarp())。

接下来的动画展示了使用网格变形算法在Python中用scipy / numpy / scikit-image实现的动画效果(从《蒙娜丽莎》到达芬奇的图像的变形序列)。你也可以在这里找到这个视频。

在这里输入图像描述

另一个流行的算法是Beier-Neely变形算法(https://en.wikipedia.org/wiki/Beier%E2%80%93Neely_morphing_algorithm

1

我不知道有没有专门做这个的库,但你可以自己动手拼凑一个。你需要一组所有人脸共有的特征点,这些点在每张脸上都能找到。然后,你可以用这些点来进行德劳内三角剖分

接下来,你可以直接把一个脸的形状转换到另一个脸上,或者先把它转换成一个标准化的脸,修改完再放到其他地方。

11

我最近写了一篇关于使用OpenCV进行人脸变形的文章。我分享了C++和Python的代码。你可以在这里找到详细信息:

http://www.learnopencv.com/face-morph-using-opencv-cpp-python/

基本的思路如下:

  1. 首先,在两张输入图片中找到对应的点。
  2. 对这些点进行德劳内三角剖分。
  3. 变形的程度由一个叫做alpha的参数控制。比如,当alpha = 0时,你会得到下面例子中的Ted Cruz,而当alpha = 1时,你会得到Hillary Clinton。对于其他的alpha值,结果就是两者的混合。使用alpha来计算输出(变形后)图像中点的位置,通过对两张输入图像中的点进行加权平均。
  4. 计算输入图像中每个三角形与目标图像(变形后的图像)之间的仿射变换。
  5. 将每个输入图像中的三角形扭曲到输出图像中,并根据alpha值混合像素。对每个三角形都这样做,你就能得到最终的变形图像。

希望这对你有帮助。

在这里输入图片描述

撰写回答