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 代码


  
  1. import dlib
  2. import face_recognition
  3. import math
  4. import numpy as np
  5. import cv2
  6. def rect_to_bbox(rect):
  7. """获得人脸矩形的坐标信息"""
  8. # print(rect)
  9. x = rect[3]
  10. y = rect[0]
  11. w = rect[1] - x
  12. h = rect[2] - y
  13. return (x, y, w, h)
  14. def face_alignment(faces):
  15. # 预测关键点
  16. predictor = dlib.shape_predictor("dat/shape_predictor_68_face_landmarks.dat")
  17. faces_aligned = []
  18. for face in faces:
  19. rec = dlib.rectangle(0, 0, face.shape[0], face.shape[1])
  20. shape = predictor(np.uint8(face), rec)
  21. # left eye, right eye, nose, left mouth, right mouth
  22. order = [36, 45, 30, 48, 54]
  23. for j in order:
  24. x = shape.part(j).x
  25. y = shape.part(j).y
  26. # 计算两眼的中心坐标
  27. eye_center =((shape.part(36).x + shape.part(45).x) * 1./2, (shape.part(36).y + shape.part(45).y) * 1./2)
  28. dx = (shape.part(45).x - shape.part(36).x)
  29. dy = (shape.part(45).y - shape.part(36).y)
  30. # 计算角度
  31. angle = math.atan2(dy, dx) * 180. / math.pi
  32. # 计算仿射矩阵
  33. RotateMatrix = cv2.getRotationMatrix2D(eye_center, angle, scale=1)
  34. # 进行仿射变换,即旋转
  35. RotImg = cv2.warpAffine(face, RotateMatrix, (face.shape[0], face.shape[1]))
  36. faces_aligned.append(RotImg)
  37. return faces_aligned
  38. def test(img_path):
  39. unknown_image = face_recognition.load_image_file(img_path)
  40. # 定位图片中的人脸
  41. face_locations = face_recognition.face_locations(unknown_image)
  42. # 提取人脸区域的图片并保存
  43. src_faces = []
  44. src_face_num = 0
  45. for (i, rect) in enumerate(face_locations):
  46. src_face_num = src_face_num + 1
  47. (x, y, w, h) = rect_to_bbox(rect)
  48. detect_face = unknown_image[y:y+h, x:x+w]
  49. src_faces.append(detect_face)
  50. detect_face = cv2.cvtColor(detect_face, cv2.COLOR_RGBA2BGR)
  51. cv2.imwrite("face_align_result/face_" + str(src_face_num) + ".jpg", detect_face)
  52. # 人脸对齐操作并保存
  53. faces_aligned = face_alignment(src_faces)
  54. face_num = 0
  55. for faces in faces_aligned:
  56. face_num = face_num + 1
  57. faces = cv2.cvtColor(faces, cv2.COLOR_RGBA2BGR)
  58. cv2.imwrite("face_align_result/face_align_" + str(face_num) + ".jpg", faces)
  59. if __name__ == '__main__':
  60. test("8.jpg")
  61. print(" SUCCEED !!! ")
  62. 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个月内不可修改。