基于 dlib 的人脸检测(68关键点) |
您所在的位置:网站首页 › dlib人脸关键点检测算法 › 基于 dlib 的人脸检测(68关键点) |
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目目录 文章目录 前言 一、背景 (1)环境搭建 (2)下载开源数据集 二、具体实现 效果展示: 效果展示: 总结 前言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)图片检测 import dlib import cv2 # 与人脸检测相同,使用dlib自带的frontal_face_detector作为人脸检测器 detector = dlib.get_frontal_face_detector() # 使用官方提供的模型构建特征提取器 predictor = dlib.shape_predictor('E:data/shape_predictor_68_face_landmarks.dat') # cv2读取图片 img = cv2.imread("E:data/jujingyi.jpg") cv2.imshow('img2', img) # 与人脸检测程序相同,使用detector进行人脸检测 dets为返回的结果 dets = detector(img, 1) # 使用enumerate 函数遍历序列中的元素以及它们的下标 # 下标k即为人脸序号 # left:人脸左边距离图片左边界的距离 ;right:人脸右边距离图片左边界的距离 # top:人脸上边距离图片上边界的距离 ;bottom:人脸下边距离图片上边界的距离 for k, d in enumerate(dets): print("dets{}".format(d)) print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format( k, d.left(), d.top(), d.right(), d.bottom())) # 使用predictor进行人脸关键点识别 shape为返回的结果 shape = predictor(img, d) # 获取第一个和第二个点的坐标(相对于图片而不是框出来的人脸) print("Part 0: {}, Part 1: {} ...".format(shape.part(0), shape.part(1))) # 绘制特征点 for index, pt in enumerate(shape.parts()): print('Part {}: {}'.format(index, pt)) pt_pos = (pt.x, pt.y) cv2.circle(img, pt_pos, 1, (255, 0, 0), 2) # 利用cv2.putText输出1-68 font = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(img, str(index + 1), pt_pos, font, 0.3, (0, 0, 255), 1, cv2.LINE_AA) cv2.imshow('img', img) k = cv2.waitKey() cv2.destroyAllWindows() 效果展示:接下来我们将代码稍作修改,改为检测视频 mport cv2 import dlib predictor_path = "E:data/shape_predictor_68_face_landmarks.dat" # 初始化 predictor = dlib.shape_predictor(predictor_path) # 初始化dlib人脸检测器 detector = dlib.get_frontal_face_detector() # 初始化窗口 win = dlib.image_window() # cap = cv2.VideoCapture('H:/2.mp4') cap = cv2.VideoCapture(0) # cap = cv2.VideoCapture(0) while cap.isOpened(): ok, cv_img = cap.read() if not ok: break img = cv2.cvtColor(cv_img, cv2.COLOR_RGB2BGR) # 转灰 dets = detector(img, 0) shapes = [] for k, d in enumerate(dets): print("dets{}".format(d)) print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format( k, d.left(), d.top(), d.right(), d.bottom())) # 使用predictor进行人脸关键点识别 shape为返回的结果 shape = predictor(img, d) # shapes.append(shape) # 绘制特征点 for index, pt in enumerate(shape.parts()): print('Part {}: {}'.format(index, pt)) pt_pos = (pt.x, pt.y) cv2.circle(img, pt_pos, 1, (0, 225, 0), 2) # 利用cv2.putText输出1-68 font = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(img, str(index + 1), pt_pos, font, 0.3, (0, 0, 255), 1, cv2.LINE_AA) win.clear_overlay() win.set_image(img) if len(shapes) != 0: for i in range(len(shapes)): win.add_overlay(shapes[i]) # win.add_overlay(dets) cap.release() 效果展示:如果需要检测视频,只需要将 cap = cv2.VideoCapture(0)括号里的0 改为视频路径即可 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |