[关闭]
@Perfect-Demo 2018-12-17T01:31:24.000000Z 字数 1461 阅读 1342

(2)68个人脸特征点标注

opencv+dlib


同样,这里用到了opencv以及dlib库,并且还有一点,用到了一个已经训练好了68特征点标注模型,所以先要导入该模型。
下面贴出该模型的链接:模型链接

然后就可以导入模型开始跑了。具体实现将直接贴出代码,然后代码意义在注释中讲得也比较清楚。

  1. import dlib
  2. import cv2
  3. import sys
  4. import os
  5. # shape_predictor_68_face_landmarks.dat是进行人脸标定的模型,它是基于HOG特征的,这里是他所在的路径
  6. current_path = os.getcwd() #获取当前路径
  7. model_path = current_path + "/model/shape_predictor_68_face_landmarks.dat"
  8. img_path = current_path + "/face/"
  9. detector = dlib.get_frontal_face_detector() #获取人脸分类器
  10. predictor = dlib.shape_predictor(model_path) #获取人脸检测器
  11. #传入命令参数
  12. for f in sys.argv[1:]:
  13. face_path = img_path + f #获取人脸图片的路径加上文件名
  14. #用opencv读取图片
  15. img = cv2.imread(face_path, cv2.IMREAD_COLOR)
  16. # 摘自官方文档:
  17. # image is a numpy ndarray containing either an 8bit grayscale or RGB image.
  18. # opencv读入的图片默认是bgr格式,我们需要将其转换为rgb格式;都是numpy的ndarray类。
  19. b, g, r = cv2.split(img) #分离是三颜色通道
  20. img = cv2.merge([r, g, b]) #把三种颜色组合成rgb新图片
  21. dets = detector(img, 1) #调用dlib库对图片进行识别
  22. print("这张图识别到 {} 张人脸".format(len(dets)))
  23. for index, face in enumerate(dets):
  24. #left()、top()、right()、bottom()都是dlib.rectangle类的方法,对应矩形四条边的位置
  25. print("人脸{}的框位置为left:{} , top:{} , right:{} , bottom{}".format(index, face.left(), face.top(), face.right(), face.bottom()))
  26. #这里不需要加框框了,需要检查那68个点
  27. point_68 = predictor(img, face) #寻找那68个标定点
  28. #现在需要将其显示出啦
  29. for index, pt in enumerate(point_68.parts()):
  30. print("Part {} 的位置是: {}".format(index, pt))
  31. pt_pos = (pt.x, pt.y)
  32. cv2.circle(img, pt_pos, 2, (255, 0, 0), 1)
  33. #现在将其显示出来
  34. # 在新窗口中显示
  35. cv2.namedWindow(face_path, cv2.WINDOW_AUTOSIZE)
  36. cv2.imshow(face_path, img)
  37. # 等待按键,随后退出,销毁窗口
  38. k = cv2.waitKey(0)
  39. cv2.destroyAllWindows()

最后进行一下勘误,我参考学习的博主代码中,对应我代码的44,45行,他可能由于笔误用错了变量,我这里更正了。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注