File size: 3,185 Bytes
5c9a8e7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import cv2 
import dlib 
import numpy as np
from math import hypot
import time
from scipy.spatial.distance import euclidean

# face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
detector = dlib.get_frontal_face_detector()
#  wget -nd https://github.com/JeffTrain/selfie/raw/master/shape_predictor_68_face_landmarks.dat
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
blink_count = 0
time_limit = 7


def mid_point(p1,p2):
    return int((p1.x + p2.x)/2) , int((p1.y + p2.y)/2)

def get_ratio(eye_points, facial_landmarks):
    # x-axis
    left_point = (facial_landmarks.part(eye_points[0]).x, facial_landmarks.part(eye_points[0]).y)
    right_point = (facial_landmarks.part(eye_points[3]).x, facial_landmarks.part(eye_points[3]).y)
    # y-axis
    center_top = mid_point(facial_landmarks.part(eye_points[1]), facial_landmarks.part(eye_points[2]))
    center_bottom = mid_point(facial_landmarks.part(eye_points[5]), facial_landmarks.part(eye_points[4]))

    hor_line = cv2.line(frame, left_point, right_point, (0, 255, 0), 1)
    ver_line = cv2.line(frame, center_top, center_bottom, (0, 255, 0), 1)

    # hor_line_length = hypot((left_point[0] - right_point[0]), (left_point[1] - right_point[1]))
    # ver_line_length = hypot((center_top[0] - center_bottom[0]), (center_top[1] - center_bottom[1]))

    hor_line_length = euclidean(left_point, right_point)
    ver_line_length = euclidean(center_top, center_bottom)
    
    if ver_line_length == 0:
        return 0
    
    ratio = hor_line_length / ver_line_length
    return ratio


cap = cv2.VideoCapture(0)   

start = time.time()
while True:
    _ , frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = detector(gray)
    # print(faces)

    for face in faces:
        x,y = face.left(), face.top()
        x1, y1 = face.right() , face.bottom()
        cv2.rectangle(frame, (x,y), (x1,y1), (0,0,255), 2)

        landmarks = predictor(gray, face)
        
    left_eye_ratio = get_ratio([36,37,38,39,40,41], landmarks)
    right_eye_ratio = get_ratio([42,43,44,45,46,47],landmarks)
    blink_ratio = left_eye_ratio + right_eye_ratio / 2
    # print(blink_ratio)


    if blink_ratio > 8.2 and blink_ratio < 9.3 :
        cv2.putText(frame, "BLINKING..", (130,180), cv2.FONT_HERSHEY_PLAIN, 6, (255, 0, 0))
        blink_count = blink_count + 1

    blink_count
    cv2.putText(frame, str(blink_count), (40,130), cv2.FONT_HERSHEY_PLAIN, 6, (255, 0, 0), 2)

    if blink_count >= 2:
        cv2.putText(frame, "HUMANNNN!!!!", (70,200), cv2.FONT_HERSHEY_PLAIN, 2, (0, 0, 255), 2)
        print("\n\n\n\n HUMAN !! \n\n\n\n\n")
        break
    if time.time() - start > time_limit:
        cv2.putText(frame, "BOT!!!!", (70,200), cv2.FONT_HERSHEY_PLAIN, 2, (0, 0, 255), 2)
        print("\n\n\n\n BOT !!!!\n\n\n\n\n")
        break

    cv2.putText(frame, "BLINK 3-4 times", (40,150), cv2.FONT_HERSHEY_PLAIN, 2, (0, 0, 255), 2)
    cv2.imshow("frame", frame)
    time_left = time.time() - start
    print(f'TIME LEFT    :  {time_left:.2f} sec  / 7 sec')

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

cap.release()
cv2.destroyAllWindows()