2017-03-01 95 views
2

我正在打哈欠检测项目,我正在使用dlib和opencv来检测视频中的脸部和地标。如何使用dlib获取眼睛和嘴巴的长度

我想要得到眼睛和嘴巴的长度。

这是我做了什么至今

import sys 
import os 
import dlib 
import glob 
from skimage import io 
import cv2 
import time 

if len(sys.argv) != 3: 
    print("") 
    exit() 

predictor_path = sys.argv[1] 
faces_folder_path = sys.argv[2] 

vidcap = cv2.VideoCapture('video.avi') 

detector = dlib.get_frontal_face_detector() 
predictor = dlib.shape_predictor(predictor_path) 
win = dlib.image_window() 

while vidcap.isOpened(): 
    success, image = vidcap.read() 
    if success: 
     win.clear_overlay() 
     win.set_image(image) 

     # Ask the detector to find the bounding boxes of each face. The 1 in the 
     # second argument indicates that we should upsample the image 1 time. This 
     # will make everything bigger and allow us to detect more faces. 
     dets = detector(image, 1) 
     print("Number of faces detected: {}".format(len(dets))) 
     for k, d in enumerate(dets): 
      print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
      k, d.left(), d.top(), d.right(), d.bottom())) 
      # Get the landmarks/parts for the face in box d. 
      shape = predictor(image, d) 
      print(shape) 
      print("Part 0: {}, Part 1: {},Part 2: {} ...".format(shape.part(0),shape.part(1),shape.part(2))) 
      # Draw the face landmarks on the screen. 
      win.add_overlay(shape) 
      win.add_overlay(dets) 
     time.sleep(0.01) 
cv2.destroyAllWindows() 
vidcap.release() 

请帮我怎么去开眼睛和嘴的长度。

+0

为什么不衡量shape.part的之间的距离? – Evgeniy

回答

3

从这个图enter image description here

import Paths 
import globals 
from globals import ClassifierFiles 
import numpy as np 
import cv2 
import time 
import dlib 
import math 
import eyeCoordinates 
import mouthCoordinates 
from globals import Threshold 
from globals import yawnFolder 
import os 
import openface 
VIDEO_PATHS = [] 


readVideo('v.avi')#test video of faces 



def readVideo(video): 
    global no,yes 
    video_capture = cv2.VideoCapture(video) 
    detector = dlib.get_frontal_face_detector() #Face detector 
    predictor = dlib.shape_predictor(ClassifierFiles.shapePredicter) #Landmark identifier 
    face_aligner = openface.AlignDlib(ClassifierFiles.shapePredicter) 

    u = 0 
    while True: 
     ret, frame = video_capture.read() 
     if frame != None: 
      gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
      # clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) 
      # clahe_image = clahe.apply(gray) 

      detections = detector(frame, 1) #Detect the faces in the image 

      for k,d in enumerate(detections): #For each detected face 
       shape = predictor(frame, d) #Get coordinates 
       vec = np.empty([68, 2], dtype = int) 
       coor = [] 
       for i in range(1,68): #There are 68 landmark points on each face 
        #cv2.circle(frame, (shape.part(i).x, shape.part(i).y), 1, (0,0,255), thickness=1) 
        coor.append([shape.part(i).x, shape.part(i).y]) 
        vec[i][0] = shape.part(i).x 
        vec[i][1] = shape.part(i).y 

       #RightEye and LeftEye coordinates 
       rightEye = eyeCoordinates.distanceRightEye(coor) 
       leftEye = eyeCoordinates.distanceLeftEye(coor) 
       eyes = (rightEye + leftEye)/2 

       #Mouth coordinates 
       mouth = mouthCoordinates.distanceBetweenMouth(coor) 

       print(eyes,mouth) 
       #prints both eyes average distance 
       #prints mouth distance 
      break 

     if cv2.waitKey(1) & 0xFF == ord('q'): 
      break 



if __name__ == '__main__': 
    VIDEO_PATHS = Paths.videosPaths() 
    init() 

eyeCoordinates文件

import distanceFormulaCalculator 

def distanceRightEye(c): 
    eR_36,eR_37,eR_38,eR_39,eR_40,eR_41 = 0,0,0,0,0,0 
    eR_36 = c[35] 
    eR_37 = c[36] 
    eR_38 = c[37] 
    eR_39 = c[38] 
    eR_40 = c[39] 
    eR_41 = c[40] 
    x1 = distanceFormulaCalculator.distanceFormula(eR_37,eR_41) 
    x2 = distanceFormulaCalculator.distanceFormula(eR_38,eR_40) 
    return ((x1+x2)/2) 

def distanceLeftEye(c): 
    eL_42,eL_43,eL_44,eL_45,eL_46,eL_47 = 0,0,0,0,0,0 
    eL_42 = c[41] 
    eL_43 = c[42] 
    eL_44 = c[43] 
    eL_45 = c[44] 
    eL_46 = c[45] 
    eL_47 = c[46] 
    x1 = distanceFormulaCalculator.distanceFormula(eL_43,eL_47) 
    x2 = distanceFormulaCalculator.distanceFormula(eL_44,eL_46) 
    return ((x1+x2)/2) 



def eyePoints(): 
    return [36,37,38,39,40,41,42,43,44,45,46,47] 

口坐标文件

import distanceFormulaCalculator 

def distanceBetweenMouth(c): 
    m_60,m_61,m_62,m_63,m_64,m_65,m_66,m_67 = 0,0,0,0,0,0,0,0 
    m_60 = c[59] 
    m_61 = c[60] 
    m_62 = c[61] 
    m_63 = c[62] 
    m_64 = c[63] 
    m_65 = c[64] 
    m_66 = c[65] 
    m_67 = c[66] 
    x1 = distanceFormulaCalculator.distanceFormula(m_61,m_67) 
    x2 = distanceFormulaCalculator.distanceFormula(m_62,m_66) 
    x3 = distanceFormulaCalculator.distanceFormula(m_63,m_65) 
    return ((x1+x2+x3)/3) 



def mouthPoints(): 
    return [60,61,62,63,64,65,66,67] 
相关问题