当前位置: 代码迷 >> 综合 >> Python+Opencv+Dlib进行人脸检测和对齐
  详细解决方案

Python+Opencv+Dlib进行人脸检测和对齐

热度:43   发布时间:2024-02-12 20:17:28.0

作为大多数人脸相关任务不可或缺的步骤,人脸检测和人脸对齐作用不言而喻。在这篇文章中,我们使用dlib中人脸检测,进行人脸图片的旋转对齐操作。

1、下载模型文件

链接    提取码:atzu

2、68 和 51 关键点

3、代码

import dlib
import face_recognition
import math
import numpy as np
import cv2def rect_to_bbox(rect):"""获得人脸矩形的坐标信息"""# print(rect)x = rect[3]y = rect[0]w = rect[1] - xh = rect[2] - yreturn (x, y, w, h)def face_alignment(faces):# 预测关键点predictor = dlib.shape_predictor("dat/shape_predictor_68_face_landmarks.dat")faces_aligned = []for face in faces:rec = dlib.rectangle(0, 0, face.shape[0], face.shape[1])shape = predictor(np.uint8(face), rec)# left eye, right eye, nose, left mouth, right mouthorder = [36, 45, 30, 48, 54]for j in order:x = shape.part(j).xy = shape.part(j).y# 计算两眼的中心坐标eye_center =((shape.part(36).x + shape.part(45).x) * 1./2, (shape.part(36).y + shape.part(45).y) * 1./2)dx = (shape.part(45).x - shape.part(36).x)dy = (shape.part(45).y - shape.part(36).y)# 计算角度angle = math.atan2(dy, dx) * 180. / math.pi# 计算仿射矩阵RotateMatrix = cv2.getRotationMatrix2D(eye_center, angle, scale=1)# 进行仿射变换,即旋转RotImg = cv2.warpAffine(face, RotateMatrix, (face.shape[0], face.shape[1]))faces_aligned.append(RotImg)return faces_aligneddef test(img_path):unknown_image = face_recognition.load_image_file(img_path)# 定位图片中的人脸face_locations = face_recognition.face_locations(unknown_image)# 提取人脸区域的图片并保存src_faces = []src_face_num = 0for (i, rect) in enumerate(face_locations):src_face_num = src_face_num + 1(x, y, w, h) = rect_to_bbox(rect)detect_face = unknown_image[y:y+h, x:x+w]src_faces.append(detect_face)detect_face = cv2.cvtColor(detect_face, cv2.COLOR_RGBA2BGR)cv2.imwrite("face_align_result/face_" + str(src_face_num) + ".jpg", detect_face)# 人脸对齐操作并保存faces_aligned = face_alignment(src_faces)face_num = 0for faces in faces_aligned:face_num = face_num + 1faces = cv2.cvtColor(faces, cv2.COLOR_RGBA2BGR)cv2.imwrite("face_align_result/face_align_" + str(face_num) + ".jpg", faces)passif __name__ == '__main__':test("8.jpg")print(" SUCCEED !!! ")pass