当前位置:   article > 正文

基于 dlib 的人脸检测(68关键点)_dlib人脸关键点检测

dlib人脸关键点检测

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

imutils 这个图像处理工具包,除了简化 opencv 的一些操作之外,还有专门配合 dlib 处理人脸数据的工具 face_utils。dlib 提取人脸数据后,五官都是用一些特征点来表示的,每个部位的点的索引是固定的,想要进一步操作就得对这些点进行处理,而 face_utils 就是简化这些点的表现方式:


dlib 提取人脸特征点是用 68 个点包围每个部位,如上图,例如第 37 个点到第 42 个点就代表右眼,在图片上这几个点若显示出来就是把右眼那块区域包围着,可以通过这些点之间距离的变化来判断人脸的变化,比如是否眨眼等操作

一、背景

(1)环境搭建

题主使用的环境配置:python3.9.13+cuda11.3+anaconda3   

pip install dlib

其中 dlib下载方法(本文仅提供py3.9版本下载)

首先安装

pip install cmake

pip install boost

下载dlib-19.23.0-cp39-cp39-win_amd64.whl

下载后在对应文件夹下执行(这个如果不清楚  剋以私聊)

pip install dlib-19.23.0-cp39-cp39-win_amd64.whl

其他版本dlib中下载

(2)下载开源数据集

shape_predictor_68_face_landmarks.dat

二、具体实现

(1)图片检测

  1. import dlib
  2. import cv2
  3. # 与人脸检测相同,使用dlib自带的frontal_face_detector作为人脸检测器
  4. detector = dlib.get_frontal_face_detector()
  5. # 使用官方提供的模型构建特征提取器
  6. predictor = dlib.shape_predictor('E:data/shape_predictor_68_face_landmarks.dat')
  7. # cv2读取图片
  8. img = cv2.imread("E:data/jujingyi.jpg")
  9. cv2.imshow('img2', img)
  10. # 与人脸检测程序相同,使用detector进行人脸检测 dets为返回的结果
  11. dets = detector(img, 1)
  12. # 使用enumerate 函数遍历序列中的元素以及它们的下标
  13. # 下标k即为人脸序号
  14. # left:人脸左边距离图片左边界的距离 ;right:人脸右边距离图片左边界的距离
  15. # top:人脸上边距离图片上边界的距离 ;bottom:人脸下边距离图片上边界的距离
  16. for k, d in enumerate(dets):
  17. print("dets{}".format(d))
  18. print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
  19. k, d.left(), d.top(), d.right(), d.bottom()))
  20. # 使用predictor进行人脸关键点识别 shape为返回的结果
  21. shape = predictor(img, d)
  22. # 获取第一个和第二个点的坐标(相对于图片而不是框出来的人脸)
  23. print("Part 0: {}, Part 1: {} ...".format(shape.part(0), shape.part(1)))
  24. # 绘制特征点
  25. for index, pt in enumerate(shape.parts()):
  26. print('Part {}: {}'.format(index, pt))
  27. pt_pos = (pt.x, pt.y)
  28. cv2.circle(img, pt_pos, 1, (255, 0, 0), 2)
  29. # 利用cv2.putText输出1-68
  30. font = cv2.FONT_HERSHEY_SIMPLEX
  31. cv2.putText(img, str(index + 1), pt_pos, font, 0.3, (0, 0, 255), 1, cv2.LINE_AA)
  32. cv2.imshow('img', img)
  33. k = cv2.waitKey()
  34. cv2.destroyAllWindows()

效果展示:

接下来我们将代码稍作修改,改为检测视频

  1. mport cv2
  2. import dlib
  3. predictor_path = "E:data/shape_predictor_68_face_landmarks.dat"
  4. # 初始化
  5. predictor = dlib.shape_predictor(predictor_path)
  6. # 初始化dlib人脸检测器
  7. detector = dlib.get_frontal_face_detector()
  8. # 初始化窗口
  9. win = dlib.image_window()
  10. # cap = cv2.VideoCapture('H:/2.mp4')
  11. cap = cv2.VideoCapture(0)
  12. # cap = cv2.VideoCapture(0)
  13. while cap.isOpened():
  14. ok, cv_img = cap.read()
  15. if not ok:
  16. break
  17. img = cv2.cvtColor(cv_img, cv2.COLOR_RGB2BGR) # 转灰
  18. dets = detector(img, 0)
  19. shapes = []
  20. for k, d in enumerate(dets):
  21. print("dets{}".format(d))
  22. print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
  23. k, d.left(), d.top(), d.right(), d.bottom()))
  24. # 使用predictor进行人脸关键点识别 shape为返回的结果
  25. shape = predictor(img, d)
  26. # shapes.append(shape)
  27. # 绘制特征点
  28. for index, pt in enumerate(shape.parts()):
  29. print('Part {}: {}'.format(index, pt))
  30. pt_pos = (pt.x, pt.y)
  31. cv2.circle(img, pt_pos, 1, (0, 225, 0), 2)
  32. # 利用cv2.putText输出1-68
  33. font = cv2.FONT_HERSHEY_SIMPLEX
  34. cv2.putText(img, str(index + 1), pt_pos, font, 0.3, (0, 0, 255), 1, cv2.LINE_AA)
  35. win.clear_overlay()
  36. win.set_image(img)
  37. if len(shapes) != 0:
  38. for i in range(len(shapes)):
  39. win.add_overlay(shapes[i])
  40. # win.add_overlay(dets)
  41. cap.release()

效果展示:

 如果需要检测视频,只需要将

cap = cv2.VideoCapture(0)

括号里的0 改为视频路径即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/116095
推荐阅读
相关标签
  

闽ICP备14008679号