结合OpenCV摄像头使用Dlib库进行人脸检测及标注特征点和提取人脸特征-Python

小灰灰 2022-05-29 05:05 278阅读 0赞

注意:需要安装opencv和dlib库,安装可见此教程。同时需要下载dlib库封装好的代码shape_predictor_68_face_landmarks.dat(用于人脸68维特征点标注)及dlib_face_recognition_resnet_model_v1.dat(用于提取人脸128维特征)。
本文所有代码及封装库可从https://github.com/TimeIvyace/Dlib-OpenCV_face.git中下载。

使用OpenCV调用摄像头并用Dlib人脸检测和标注特征点

  1. import cv2
  2. import dlib
  3. PREDICTOR_PATH = "shape_predictor_68_face_landmarks.dat"
  4. # 使用dlib自带的frontal_face_detector作为人脸提取器
  5. detector = dlib.get_frontal_face_detector()
  6. # 使用官方模型构建特征提取器
  7. predictor = dlib.shape_predictor(PREDICTOR_PATH)
  8. if __name__ == '__main__':
  9. #框住人脸的矩形边框颜色
  10. color = (0, 255, 0)
  11. #捕获指定摄像头的实时视频流
  12. cap = cv2.VideoCapture(0)
  13. #循环检测识别人脸
  14. while True:
  15. _, frame = cap.read() #读取一帧视频
  16. # 图像灰化,降低计算复杂度
  17. frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  18. # 使用detector进行人脸检测 rects为返回的结果
  19. rects = detector(frame_gray, 1)
  20. if len(rects) > 0:
  21. for k, d in enumerate(rects):
  22. cv2.rectangle(frame, (d.left(), d.top()), (d.right(), d.bottom()), (255, 255, 255))
  23. shape = predictor(frame, d)
  24. for i in range(68):
  25. cv2.circle(frame, (shape.part(i).x, shape.part(i).y), 5, (0, 255, 0), -1, 8)
  26. cv2.putText(frame, str(i), (shape.part(i).x, shape.part(i).y), cv2.FONT_HERSHEY_SIMPLEX, 0.5,
  27. (255, 255, 255))
  28. cv2.imshow("find me", frame)
  29. #等待10毫秒看是否有按键输入
  30. k = cv2.waitKey(10)
  31. #如果输入q则退出循环
  32. if k & 0xFF == ord('q'):
  33. break
  34. #释放摄像头并销毁所有窗口
  35. cap.release()
  36. cv2.destroyAllWindows()

使用Dlib中的残差网络封装库提取人脸128维特征

  1. import dlib
  2. import cv2
  3. import numpy as np
  4. def dlib_get_face(frame_path, face_rec_model_path, predictor_path):
  5. # 使用dlib自带的frontal_face_detector作为人脸提取器
  6. detector = dlib.get_frontal_face_detector()
  7. shape_predictor = dlib.shape_predictor(predictor_path)
  8. face_rec_model = dlib.face_recognition_model_v1(face_rec_model_path)
  9. # opencv读取图片,并显示
  10. frame = cv2.imread(frame_path, cv2.IMREAD_COLOR)
  11. # opencv的bgr格式图片转换成rgb格式
  12. b, g, r = cv2.split(frame)
  13. frame2 = cv2.merge([r, g, b])
  14. # 使用detector进行人脸检测dets为返回的结果
  15. dets = detector(frame, 1)
  16. face_descriptor = []
  17. for index, face in enumerate(dets):
  18. shape = shape_predictor(frame, face) # 提取68个特征点
  19. # 计算人脸的128维的向量
  20. face_descriptor.append(face_rec_model.compute_face_descriptor(frame2, shape))
  21. return np.array(face_descriptor)
  22. frame_path = "a.jpeg" # 需要检测的图像,可结合上式代码使用摄像头
  23. face_rec_model_path = "dlib_face_recognition_resnet_model_v1.dat"
  24. predictor_path = "shape_predictor_68_face_landmarks.dat"
  25. face = dlib_get_face(frame_path, face_rec_model_path, predictor_path)
  26. print(face.shape)

发表评论

表情:
评论列表 (有 0 条评论,278人围观)

还没有评论,来说两句吧...

相关阅读

    相关 人脸特征提取与加强技术

    人脸特征点提取与加强技术 随着计算机视觉技术的不断发展,人脸特征点提取已经成为了许多实际应用领域的必要步骤。本文介绍了一种人脸特征点提取和加强的方法,该方法基于深度学习技术,

    相关 人脸特征检测--基于DLIB

      Dlib是一个C++编写的工具包,它包含了机器学习算法以及一些用来解决现实复杂问题的工具,可以广泛应用于机器人、嵌入式设备、手机,甚至高性能计算中,可以在其官网了解更多。这