zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    Statement
    打印页数设定
    点选TOP后并不是直接跳到页顶的,而是滚动上去
    文本框不允许输入特殊字符,只能是数字、字母、-和_,不允许输入空格键
    不间断滚动
    无限级别的菜单(侧拉菜单)
    筛法求素数
    1212
    触发器引发的entityframework异常
    using crystalreport generate PDF2
  • 原文地址:https://www.cnblogs.com/youxin/p/15737949.html
Copyright © 2011-2022 走看看