Determine The Face Tilt Using OpenCV Python (original) (raw)

import cv2 as cv

import numpy as np

capture = cv.VideoCapture( 0 )

face_cascade = cv.CascadeClassifier( 'haarcascade_frontalface_default.xml' )

eye_cascade = cv.CascadeClassifier( "haarcascade_eye.xml" )

while True :

`` ret, frame = capture.read()

`` gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

`` faces = face_cascade.detectMultiScale(gray, 1.1 , 5 )

`` x, y, w, h = 0 , 0 , 0 , 0

`` for (x, y, w, h) in faces:

`` cv.rectangle(frame, (x, y), (x + w, y + h), ( 0 , 255 , 0 ), 2 )

`` cv.circle(frame, (x + int (w * 0.5 ), y +

`` int (h * 0.5 )), 4 , ( 0 , 255 , 0 ), - 1 )

`` eyes = eye_cascade.detectMultiScale(gray[y:(y + h), x:(x + w)], 1.1 , 4 )

`` index = 0

`` eye_1 = [ None , None , None , None ]

`` eye_2 = [ None , None , None , None ]

`` for (ex, ey, ew, eh) in eyes:

`` if index = = 0 :

`` eye_1 = [ex, ey, ew, eh]

`` elif index = = 1 :

`` eye_2 = [ex, ey, ew, eh]

`` cv.rectangle(frame[y:(y + h), x:(x + w)], (ex, ey),

`` (ex + ew, ey + eh), ( 0 , 0 , 255 ), 2 )

`` index = index + 1

`` if (eye_1[ 0 ] is not None ) and (eye_2[ 0 ] is not None ):

`` if eye_1[ 0 ] < eye_2[ 0 ]:

`` left_eye = eye_1

`` right_eye = eye_2

`` else :

`` left_eye = eye_2

`` right_eye = eye_1

`` left_eye_center = (

`` int (left_eye[ 0 ] + (left_eye[ 2 ] / 2 )),

`` int (left_eye[ 1 ] + (left_eye[ 3 ] / 2 )))

`` right_eye_center = (

`` int (right_eye[ 0 ] + (right_eye[ 2 ] / 2 )),

`` int (right_eye[ 1 ] + (right_eye[ 3 ] / 2 )))

`` left_eye_x = left_eye_center[ 0 ]

`` left_eye_y = left_eye_center[ 1 ]

`` right_eye_x = right_eye_center[ 0 ]

`` right_eye_y = right_eye_center[ 1 ]

`` delta_x = right_eye_x - left_eye_x

`` delta_y = right_eye_y - left_eye_y

`` angle = np.arctan(delta_y / delta_x)

`` angle = (angle * 180 ) / np.pi

`` if angle > 10 :

`` cv.putText(frame, 'RIGHT TILT :' + str ( int (angle)) + ' degrees' ,

`` ( 20 , 30 ), cv.FONT_HERSHEY_SIMPLEX, 1 ,

`` ( 0 , 0 , 0 ), 2 , cv.LINE_4)

`` elif angle < - 10 :

`` cv.putText(frame, 'LEFT TILT :' + str ( int (angle)) + ' degrees' ,

`` ( 20 , 30 ), cv.FONT_HERSHEY_SIMPLEX, 1 ,

`` ( 0 , 0 , 0 ), 2 , cv.LINE_4)

`` else :

`` cv.putText(frame, 'STRAIGHT :' , ( 20 , 30 ),

`` cv.FONT_HERSHEY_SIMPLEX, 1 ,

`` ( 0 , 0 , 0 ), 2 , cv.LINE_4)

`` cv.imshow( 'Frame' , frame)

`` if cv.waitKey( 1 ) & 0xFF = = 27 :

`` break

capture.release()

cv.destroyAllWindows()