opencv 换脸(1)

作者: zidea | 来源:发表于2019-08-17 20:52 被阅读33次

最近流行一个换脸的软件,我们来基于 opencv 来尝试实现一下。

import cv2

img = cv2.imread("images/robort/03.jpg")

cv2.imshow("Image 1",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

首先我们加载图片然后将图片显示出来。

import cv2
import numpy as np
import dlib


img = cv2.imread('05.jpg')

cv2.imshow("image 1",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

我们使用 dlib 库来识别 face,我这里是在 mac 上安装 dlib ,安装过程还是需要做些一些工作。大家里上网搜索一下有关如何在您的对应系统安装 dlib。

import cv2
import numpy as np
import dlib


img = cv2.imread('05.jpg')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
detector = dlib.get_frontal_face_detector()
faces = detector(img_gray)

首先我们为了识别图中 face 所以先将图片进行去色处理,然后我们使用 shape_predictor_68_face_landmarks.dat 训练好的模型进行识别 face。获取好我们需要人脸识别器 detector 然后将图片传入 detector 后就得到 faces 数据。



for face in faces:
    lamdmarks = predictor(img_gray,face)

    lamdmarks_points = []

    for n in range(0,68):
        x = lamdmarks.part(n).x
        y = lamdmarks.part(n).y
        lamdmarks_points.append((x,y))
        cv2.circle(img,(x,y),3,(0,0,255))
cv2.imshow("image 1",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

然后通过识别器识别图片 face 后返回数据,我们仅取 68 点然后将这些点绘制到图片上


在opencv中,通过函数convexHulll能很容易的得到一系列点的凸轮廓,比如由点组成的轮廓,通过convexHull函数,我们就能得到轮廓的凸包。下面的图就是一些点集的轮廓。


points = np.array(lamdmarks_points,np.int32)
contexhull = cv2.convexHull(points)
# print(contexhull)

cv2.polylines(img,[contexhull],True,(255,0,0), 3)

我们将所有识别面部的标识点,然后使用 convexHull 识别这些点的外部轮廓,使用 polylines 绘制面部轮廓线。


mask = np.zeros_like(img_gray)

zeros_like 根据我们图片像素矩阵形成一个全部为 0 的矩阵表示为全黑色图片。

points = np.array(lamdmarks_points,np.int32)
convexhull = cv2.convexHull(points)
cv2.polylines(img,[convexhull],True,(255,0,0), 3)
cv2.fillConvexPoly(mask,convexhull,255)

fillConvexPoly 方法将根据 convexhull 线将图片在面部轮廓内部分颜色处理为白色,从而形成一个遮罩,用于我们进行面部抠图。


face_image_1 = cv2.bitwise_and(img,img,mask=mask);

通过 bitwise_and 算法也就是将遮罩 mask 用于图片,因为黑色部分为 0 所有 0000000 与对应像素 1010101 (例)进行取和操作都是为 0 所以现实遮罩的效果


相关文章

  • opencv 换脸(1)

    最近流行一个换脸的软件,我们来基于 opencv 来尝试实现一下。 首先我们加载图片然后将图片显示出来。 我们使用...

  • opencv换脸(2)

    我们基本思路是从识别出特征点出发,连接这些特征点形成一个一个的三角形,然后用相同点连接三角形进行替换来实现换脸的效...

  • 人脸融合?没有想象中难!

    颜如玉 颜如玉 —— python + opencv 人脸融合程序,可实现类似天天P图疯狂换脸、face++人脸融...

  • 换脸商店(1)

    第一章 来访 第一章名为陈曦的女人来访 “怪物来了,快跑!小心被她抓住!”一群小孩子看到莫怪,一哄而散,还不时往莫...

  • 校园换脸事件(1)

    “呜呜~~呜呜~~~~” 是女人的哭声。 夜深人静的深夜,这哭声久久的回荡在空荡荡的夜色中,越发显得凄凉。 “好了...

  • 换脸

    1 课间十分钟,高二一班乱哄哄的。 老师前脚一走,就有一半同学哀嚎着趴在了课桌上,而另一半同学则努力地把握这珍贵的...

  • 换·脸

    1. 大壮是个程序员,跟他妈相依为命,年龄老大不小了,老妈天天催着他找女朋友,说他再不找女朋友,她广场舞都没心思去...

  • “换脸”

    终于找到花薇售后部大门花一样的姑娘笑吟吟一问换个屏多少钱?差不多是,手机的一半现金! 我说,打个折嘛姑娘的酒窝里隐...

  • 换脸

    小宁总是喜欢独来独往,因为她发现了一个天大的秘密。 她走在路上看到每个人都有两张脸,一张正常脸,另一张长在左边胸口...

  • 换脸

    3D换脸:3D实时换脸又有新进展!中科院博士生提出改进版本,每张图推理只需0.27毫秒 https://githu...

网友评论

    本文标题:opencv 换脸(1)

    本文链接:https://www.haomeiwen.com/subject/stfhsctx.html