使用opencv进行脸部变形

时间:2014-06-12 13:41:02

标签: opencv image-processing computer-vision

我可以使用opencv获取有关如何在实时视频中变形脸部的一些想法吗?我尝试了Face substitution但是使用openFrameworks实现了它。

我想使用opencv实现相同的功能。 opencv中是否还有其他方法可以将Face替换代码从openFrameworks直接移植到Opencv?

我也经历过这个link,但很少有人提到face morphing is deprecated in opencv

4 个答案:

答案 0 :(得分:8)

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

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

但基本思路如下。

  1. 在两个输入图像中查找点对应关系。
  2. Delaunay对点数进行三角测量。
  3. 变形量由参数alpha控制。例如,对于alpha = 0,您将在下面的示例中获得Ted Cruz,并且对于alpha = 1.您将获得Hillary Clinton。对于任何其他alpha,它将是两者之间的混合。使用alpha通过获取两个输入图像点的加权平均值来计算输出(变形)图像中点的位置。
  4. 计算输入图像中的每个三角形与目标图像(变形图像)之间的仿射变换。
  5. 从每个输入图像到输出图像的变形三角形,并基于alpha混合像素。对每个三角形执行此操作,您将获得输出变形图像。
  6. 希望这会有所帮助。

    enter image description here

答案 1 :(得分:1)

我不知道任何图书馆专门做这件事,但你可以自己拼凑一些东西。您需要一组在所有面孔中引用的常见fiducial points。然后,您想要使用这些点来对其进行Delaunay triangulation

现在你可以直接从一个面部机箱转换到另一个面部机架,或者你可以将它写入中间规范化面部,对其进行更改然后将其写入任何地方。

答案 2 :(得分:1)

以下是使用 mesh-warping 算法实现面部变形的步骤(您可以使用opencv或python scipy / scikit-image来实现):

  1. 定义对应点:使用面部界标查找要对齐的面孔之间的点对应关系(例如,使用dlib检测界标)。
  2. Delaunay三角剖分:您需要提供这些点的三角剖分(例如,Delaunay三角剖分),这些点将用于变形(例如scipy.spatial的{​​{1}},例如,)。
  3. C 包含中间(变形)面:计算平均形状,将两个面都扭曲为该形状(使用源图像中的三角形计算仿射变换,使用变形后的图像计算对应的仿射变换使用Delaunay的{​​{1}},对三角形内的点进行变形并对三角形内的点进行变形,并对变形后的图像进行alpha混合以获得最终变形的图像。

下一个动画显示了使用scikit-image / warp() / scipy在python中的 warm-warping 算法实现的动画输出(变形图像序列)从Monalisa图片到Leonardo da Vinci图片开始)。也可以在here中找到。

enter image description here

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

答案 3 :(得分:0)

使用OpenCV在Python中检查face-morphing tool