python opencv dlib 人脸68个关键点检测并标注

 

人脸检测+标注
利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68点标定,利用 opencv 进行图像化处理,在人脸上画出68个点,并标明序号;

68点标注模型下载: https://github.com/davisking/dlib-models 或者http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2

  1. 调用dlib库来进行人脸识别,调用预测器“shape_predictor_68_face_landmarks.dat”进行68点标定
  2. 存入68个点坐标
  3. 利用 cv2.circle 来画68个点
  4. 利用 cv2.putText() 函数来画数字1-68

# _*_ coding:utf-8 _*_

import numpy as np
import cv2
import dlib

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')

# cv2读取图像
img = cv2.imread("1.jpg")

# 取灰度
img_gray = cv2.cvtColor(img, 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(img,rects[i]).parts()])
    for idx, point in enumerate(landmarks):
        # 68点的坐标
        pos = (point[0, 0], point[0, 1])
        print(idx,pos)

        # 利用cv2.circle给每个特征点画一个圈,共68个
        cv2.circle(img, pos, 5, color=(0, 255, 0))
        # 利用cv2.putText输出1-68
        font = cv2.FONT_HERSHEY_SIMPLEX
        cv2.putText(img, str(idx+1), pos, font, 0.8, (0, 0, 255), 1,cv2.LINE_AA)

cv2.namedWindow("img", 2)
cv2.imshow("img", img)
cv2.waitKey(0)

摄像头实时

import dlib 
import numpy as np 

detector=dlib.get_frontal_face_detector()
predictor=dlib.shape_predictor("./shape_predictor_68_face_landmarks.dat")



def Detect_face(camera_idx):
    # camera_idx: 电脑自带摄像头或者usb摄像头
    cv2.namedWindow("detect")
    cap=cv2.VideoCapture(camera_idx)
    cap.set(3, 1280)
    cap.set(4, 1280)

    while cap.isOpened():
        cv2.namedWindow('detect', cv2.WINDOW_AUTOSIZE)
        ## frame = cv.flip(frame, 1, dst=None)
        ok,frame=cap.read()
        if not ok:
            break 
        gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        rects=detector(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):
                    pos = (point[0, 0], point[0, 1])
                    # print(idx, pos)
                    cv2.circle(frame, pos, 1, color=(0, 255, 0))
                    font = cv2.FONT_HERSHEY_SIMPLEX
                    cv2.putText(frame, str(idx + 1), pos, font, 0.4, (0, 255, 255), 1, cv2.LINE_AA)
        cv2.imshow('detect', frame)
        c = cv2.waitKey(10)
        if c & 0xFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()


if __name__=='__main__':
    Detect_face(0)
原文地址:https://www.cnblogs.com/youxin/p/15737949.html