• 大小: 68.91MB
    文件类型: .zip
    金币: 2
    下载: 2 次
    发布日期: 2022-01-03
  • 语言: Python
  • 标签: Python  人脸合成  

资源简介

如今,随着技术的不断进步,“变脸”技术不再是四川喜剧的“独门武功”。运用机器学习的方法,我们同样可以实现人脸“融合”。当然这里说的人脸融合指的是将两个人的人脸照片进行融合,至于融合的比例,要按照自己的喜好来定。代码说明见:https://blog.csdn.net/m0_38106923/article/details/88856471

资源截图

代码片段和文件信息

import numpy as np
import cv2
import dlib
from scipy.spatial import Delaunay


predictor_model = ‘shape_predictor_68_face_landmarks.dat‘


def get_points(image):  # 用 dlib 来得到人脸的特征点

    face_detector = dlib.get_frontal_face_detector()  # 正向人脸检测器,进行人脸检测,提取人脸外部矩形框
    face_pose_predictor = dlib.shape_predictor(predictor_model)
    try:
        detected_face = face_detector(image 1)[0]
    except:
        print(‘No face detected in image {}‘.format(image))
    pose_landmarks = face_pose_predictor(image detected_face)  # 获取landmark
    points = []
    for p in pose_landmarks.parts():
        points.append([p.x p.y])

    # 加入四个顶点和四条边的中点
    x = image.shape[1] - 1
    y = image.shape[0] - 1
    points.append([0 0])
    points.append([x // 2 0])
    points.append([x 0])
    points.append([x y // 2])
    points.append([x y])
    points.append([x // 2 y])
    points.append([0 y])
    points.append([0 y // 2])

    return np.array(points)


def get_triangles(points):  #  在特征点上使用 Delaunay 三角剖分,将点集连接成一定大小的三角形,且分配要相对合理,才能呈现出漂亮的三角化
    return Delaunay(points).simplices


def affine_transform(input_image input_triangle output_triangle size):  # 对人脸进行仿射变换,确定位置
    warp_matrix = cv2.getAffineTransform(
        np.float32(input_triangle) np.float32(output_triangle))
    output_image = cv2.warpAffine(input_image warp_matrix (size[0] size[1]) None
                                  flags=cv2.INTER_LINEAR borderMode=cv2.BORDER_REFLECT_101)
    return output_image


def morph_triangle(img1 img2 img tri1 tri2 tri alpha):  # 三角形变形,Alpha 混合
    # 计算三角形的边界框
    rect1 = cv2.boundingRect(np.float32([tri1]))  # 寻找tri1的左上角坐标,和tri1的长和宽
    rect2 = cv2.boundingRect(np.float32([tri2]))
    rect = cv2.boundingRect(np.float32([tri]))

    tri_rect1 = []
    tri_rect2 = []
    tri_rect_warped = []

    for i in range(0 3):
        tri_rect_warped.append(
            ((tri[i][0] - rect[0]) (tri[i][1] - rect[1])))
        tri_rect1.append(
            ((tri1[i][0] - rect1[0]) (tri1[i][1] - rect1[1])))
        tri_rect2.append(
            ((tri2[i][0] - rect2[0]) (tri2[i][1] - rect2[1])))

    # 在边界框内进行仿射变换
    img1_rect = img1[rect1[1]:rect1[1] +
                     rect1[3] rect1[0]:rect1[0] + rect1[2]]
    img2_rect = img2[rect2[1]:rect2[1] +
                     rect2[3] rect2[0]:rect2[0] + rect2[2]]

    size = (rect[2] rect[3])
    warped_img1 = affine_transform(
        img1_rect tri_rect1 tri_rect_warped size)
    warped_img2 = affine_transform(
        img2_rect tri_rect2 tri_rect_warped size)

    # 加权求和
    img_rect = (1.0 - alpha) * warped_img1 + alpha * warped_img2

    # 生成模板
    mask = np.zeros((rect[3] rect[2] 3) dtype=np.float32)
    cv2.fillConvexPoly(mask np.int32(tri_rect_warped) (1.0 1.0 1.0) 16 0)

    # 应用模板
    img[rect[1]:rect[1] + rect[3] rect[0]:rect[0] + rect[2]] = \
        img[rect[1]:rect[1] + rect[3] rect[0]:rect[0] +
            rect[2]] * (1 - mask) + img_rect * mask


def morph_faces(filename1 fi

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2019-04-02 14:31  Python+Dlib库实现人脸合成\
     文件      220262  2019-03-27 14:14  Python+Dlib库实现人脸合成\bg.png
     文件        4726  2019-03-27 14:06  Python+Dlib库实现人脸合成\face_morhper.py
     文件       37479  2019-03-26 19:33  Python+Dlib库实现人脸合成\im1.jpg
     文件       44083  2019-03-27 14:12  Python+Dlib库实现人脸合成\im2.jpg
     文件        3359  2019-03-27 13:48  Python+Dlib库实现人脸合成\interface.py
     文件       57224  2019-03-28 14:46  Python+Dlib库实现人脸合成\m1_2_0.5.jpg
     文件    99693937  2018-05-20 11:29  Python+Dlib库实现人脸合成\shape_predictor_68_face_landmarks.dat

评论

共有 条评论