实现平均脸制作

平均脸,指从一定数量的普通人脸提取面部特征,根据测量数据求平均值,再利用计算机技术得到一张合成脸。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import imutils
from imutils.face_utils import FaceAligner
import dlib
import cv2 as cv
import numpy as np
import time
import os

#========================================================
# 提取人脸并保存
#========================================================

def rect_to_bb(rect):
'''
获得人脸矩形的坐标信息
'''
x = rect.left()
y = rect.top()
w = rect.right() - x
h = rect.bottom() - y
return (x, y, w, h)

def face_align(img_path):
'''
人脸校准
'''
# 人脸检测器
detector = dlib.get_frontal_face_detector()

# 人脸特征提取器
predictor = dlib.shape_predictor("model/shape_predictor_68_face_landmarks.dat")
# 初始化人脸对齐的类
fa = FaceAligner(predictor, desiredFaceWidth=256)

# 检测图中所有人脸
image = cv.imread(img_path)
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
rects = detector(gray, 1)

# 人脸校准
for rect in rects:
print('find face!')
(x, y, w, h) = rect_to_bb(rect)

# 调用align函数对图像中的指定人脸进行处理
face_aligned = fa.align(image, gray, rect)

# 存储校准后的人脸
i = int(round(time.time()*1000))
cv.imwrite('face/face_aligned_'+str(i)+'.jpg', face_aligned)

#========================================================
# 读取人脸图片
#========================================================

def read_images(path):
'''
读取指定目录下的人脸图片
'''
images = []

for filePath in os.listdir(path):
if filePath.endswith(".jpg"):
img = cv.imread(os.path.join(path, filePath))
img = np.float32(img)
images.append(img)
return images

#========================================================
# 生成特征脸
#========================================================

def calculate_faceAverage(images):
output = np.zeros((images[0].shape[0], images[0].shape[1], 3), np.float32())
for i in range(len(images)):
img = images[i]
output = output + img
output = output / len(images)
cv.imwrite('myaverageface.png', (output).astype('uint8'))

#========================================================
# 主程序
#========================================================

if __name__=='__main__':
# 提取人脸
face_align('1.jpg')
face_align('2.jpg')
face_align('3.jpg')
face_align('4.jpg')

images = read_images('face/')
calculate_faceAverage(images)
0%