dlib人脸对齐

举报
风吹稻花香 发表于 2021/06/04 23:44:26 2021/06/04
【摘要】 dlib人脸对齐(python)   注意:程序都是0开始编号关键点的 这个人脸对齐是平面的对齐,只能图片中的人脸换成垂直的,不能获取人脸3维姿态,比如侧脸,低头,抬头. 1 68 和 51 关键点   2 人脸对齐 a 定位图片中的人脸 b 提取人脸区域的图片并保存 c 人脸对齐操作并保存 &nbsp...

dlib人脸对齐(python)

 

注意:程序都是0开始编号关键点的

这个人脸对齐是平面的对齐,只能图片中的人脸换成垂直的,不能获取人脸3维姿态,比如侧脸,低头,抬头.

1 68 和 51 关键点

 

2 人脸对齐

a 定位图片中的人脸

b 提取人脸区域的图片并保存

c 人脸对齐操作并保存

 

3 代码


      import dlib
      import face_recognition
      import math
      import numpy as np
      import cv2
      def rect_to_bbox(rect):
      """获得人脸矩形的坐标信息"""
      # print(rect)
      x = rect[3]
      y = rect[0]
      w = rect[1] - x
      h = rect[2] - y
      return (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 mouth
      order = [36, 45, 30, 48, 54]
      for j in order:
      x = shape.part(j).x
      y = 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_aligned
      def 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 = 0
      for (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 = 0
      for faces in faces_aligned:
      face_num = face_num + 1
      faces = cv2.cvtColor(faces, cv2.COLOR_RGBA2BGR)
      cv2.imwrite("face_align_result/face_align_" + str(face_num) + ".jpg", faces)
      if __name__ == '__main__':
      test("8.jpg")
      print(" SUCCEED !!! ")
      pass
  
 

 

  1.  

5 原图及结果

   原图:

   结果:

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/102880110

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。