2025年3月24日 星期一 甲辰(龙)年 月廿三 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

Python+dlib检测人脸、脸颊及前额区域

时间:04-17来源:作者:点击数:37

最近在做人脸相关课题,找个地方保存一下部分代码。

用的dlib是81个关键点,GitHub网址:https://github.com/codeniko/shape_predictor_81_face_landmarks

  • #读取视频,检测一帧中的人脸,并在图像中标出关键点,同时打印出关键点的坐标。
  • import dlib
  • import numpy as np
  • import cv2
  • from matplotlib import pyplot as plt
  • cap = cv2.VideoCapture('视频路径')
  • predictor_path = "shape_predictor_81_face_landmarks.dat的路径"
  • detector = dlib.get_frontal_face_detector()
  • predictor = dlib.shape_predictor(predictor_path)
  • while(True):
  • ret, frame = cap.read()
  • # 取灰度
  • img_gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
  • # 人脸数rects
  • rects = detector(img_gray, 0)
  • for i in range(len(rects)):
  • landmarks = np.matrix([[p.x, p.y] for p in predictor(frame, rects[i]).parts()])
  • for idx, point in enumerate(landmarks):
  • # 81点的坐标
  • pos = (point[0, 0], point[0, 1])
  • # 利用cv2.circle给每个特征点画一个圈,共81个
  • cv2.circle(frame, pos, 2, color=(0, 255, 0))
  • # 利用cv2.putText输出1-81
  • font = cv2.FONT_HERSHEY_SIMPLEX
  • cv2.putText(frame, str(idx + 1), pos, font, 0.3, (0, 0, 255), 1, cv2.LINE_AA)
  • print("index=" + str(idx+1) + " x=" + str(pos[0]) + " y=" + str(pos[1]))
  • plt.imshow(frame)
  • plt.show()
  • if cv2.waitKey(1) & 0xFF == ord('q'):
  • print("q pressed")
  • break
  • cap.release()
  • cv2.destroyAllWindows()

接下来根据上面的人脸关键点,选取ROI。

  • a = np.arange(81)
  • b = np.arange(81)
  • # 取灰度
  • img_gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
  • dets = detector(img_gray, 0)
  • if (len(dets) != 0):
  • # 找到脸颊区域
  • for i in range(len(dets)):
  • landmarks = np.matrix([[p.x, p.y] for p in predictor(frame, dets[i]).parts()])
  • for idx, point in enumerate(landmarks):
  • # 68点的坐标
  • pos = (point[0, 0], point[0, 1])
  • # ROI:脸颊区域
  • a = a.tolist()
  • b = b.tolist()
  • a[idx] = point[0, 0]
  • b[idx] = point[0, 1]
  • a = np.array(a)
  • b = np.array(b)
  • # 额头区域
  • x1 = int(a[76])
  • y1 = int(b[19])
  • x2 = int(a[73])
  • y2 = int(b[73])
  • if (x1 < 0): # 防止人脸转动,x1位置超出图像
  • x1 = 0
  • forehead_ROI = frame[y2:y1, x1:x2]
  • # 脸颊区域
  • x1 = int((a[2] + a[4]) / 2)
  • y1 = int((b[2] + b[4]) / 2)
  • y2 = int((b[2] + b[23]) / 2)
  • x2 = int((a[12] + a[14]) / 2)
  • if (x1 < 0):
  • x1 = 0
  • cheek_ROI = frame[y2:y1, x1:x2]
  • # 检测整个人脸区域
  • for k, d in enumerate(dets):
  • [x1, x2, y1, y2] = [d.left(), d.right(), d.top(), d.bottom()]
  • face_ROI = frames[y1:y2, x1:x2]
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门