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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM