资源简介
如今,随着技术的不断进步,“变脸”技术不再是四川喜剧的“独门武功”。运用机器学习的方法,我们同样可以实现人脸“融合”。当然这里说的人脸融合指的是将两个人的人脸照片进行融合,至于融合的比例,要按照自己的喜好来定。代码说明见: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
相关资源
- python实现SGBM图像匹配算法
- python实现灰度直方图均衡化
- scrapy_qunar_one
- Python学习全系列教程永久可用
- python简明教程.chm
- 抽奖大转盘python的图形化界面
- 双边滤波器实验报告及代码python
- python +MYSQL+HTML实现21蛋糕网上商城
- Python-直播答题助手自动检测出题搜索
- OpenCV入门教程+OpenCV官方教程中文版
- Python 串口工具源码+.exe文件
- Python开发的全栈股票系统.zip
- Python操作Excel表格并将其中部分数据写
- python书籍 PDF
- 利用python绘制散点图
- python+labview+No1.vi
- 老男孩python项目实战
- python源码制作whl文件.rar
- python3.5可用的scipy
- PYTHON3 经典50案例.pptx
- 计算机科学导论-python.pdf
- python模拟鼠标点击屏幕
- windows鼠标自动点击py脚本
- 鱼c小甲鱼零基础学python全套课后题和
- Python 练习题100道
- Practical Programming 2nd Edition
- wxPython Application Development Cookbook
- python 3.6
- Python 3.5.2 中文文档 互联网唯一CHM版本
- python3.5.2.chm官方文档
评论
共有 条评论