安装环境
dlib
windows10安装dlib
在anaconda3下激活相应的环境
conda install -c conda-forge dlib
脚本实现
from imutils.face_utils import FaceAligner
from imutils.face_utils import rect_to_bb
import argparse
import imutils
import dlib
import cv2
ap = argparse.ArgumentParser()
ap.add_argument('-p','--shape-predictor',required=True,
help='path to the landmark predictor')
ap.add_argument('-i','--image',required=True,
help='path to the input image')
args = vars(ap.parse_args())
detector = dlib.get_frontal_face_detector()
print(type(detector))
print(detector)
predictor = dlib.shape_predictor(args['shape_predictor'])
fa = FaceAligner(predictor, desiredFaceWidth=256)
image = cv2.imread(args['image'])
image = imutils.resize(image, width=800)
print(type(image))
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow('Input', image)
# cv2.waitKey(30)
rects = detector(gray, 2)
for rect in rects:
(x, y, w, h) = rect_to_bb(rect)
faceOrig = imutils.resize(image[y:y+h, x:x+w], width=256)
faceAligned = fa.align(image, gray, rect)
cv2.imshow('Original',faceOrig)
cv2.imshow('Aligned',faceAligned)
cv2.waitKey(0)
运行代码
python align_faces.py -p shape_predictor_68_face_landmarks.dat -i images/1.jpg
检测器(shape_predictor_68_face_landmarks.dat)下载链接:
链接:https://pan.baidu.com/s/11Z9GTaNeTb-HbF6RPu0g4A
提取码:98rz
实现效果
运行问题
debug
Traceback (most recent call last):
File "D:/BaiduNetdiskDownload/阶段6-人工智能项目实战/08_人脸识别项目/code/Day03/face-alignment/align_faces.py", line 35, in <module>
faceAligned = fa.align(image, gray, rect)
File "E:\anaconda3\envs\face\lib\site-packages\imutils\face_utils\facealigner.py", line 68, in align
M = cv2.getRotationMatrix2D(eyesCenter, angle, scale)
TypeError: Can't parse 'center'. Sequence item with index 0 has a wrong type
考虑先实现cv2.getRotationMatrix2D(eyesCenter, angle, scale)
# -- coding: utf-8 --
import cv2
import numpy as np
img = cv2.imread('images/1.jpg') # 读入图像,(H, W, C)
rows, cols = img.shape[:2] # 取前两个值(H,W)
print(rows, cols)
# 第一个参数旋转中心,第二个参数旋转角度,第三个参数:缩放比例, 生成一2*3的矩阵
center = (cols / 2, rows / 2) # 以图像中心为旋转中心
angle = 90 # 顺时针旋转90°
scale = 1 # 等比例旋转,即旋转后尺度不变
M = cv2.getRotationMatrix2D(center, angle, scale)
print(M)
'''
[[ 6.123234e-17 1.000000e+00 2.135000e+02]
[-1.000000e+00 6.123234e-17 1.066500e+03]]
'''
以上代码能成功地运行,debug发现center需要的数据类型是float,而人脸对齐的代码报错是’center’类别的错误,于是就有个大胆的想法,将源码中涉及计算center的部分修改,将2修改成2.0
如图说示:
即可成功运行代码,就是上面实现效果的图!!!