import picamera
import cv2
import math
"""
camera = picamera.PiCamera()
camera.resolution=(1024,768)
camera.brightness=60
camera.rotation = 0
camera.crop = (0.0,0.0,1,1)
camera.capture('image.jpg')
camera.close()
"""

image = cv2.imread('clinton.jpg')#Chargement des clasifieurs
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') #Classifieur pour la detection du visage
eyeCascade = cv2.CascadeClassifier('haarcascade_eye.xml') #Classifieur pour la detection des yeux
mouthCascade = cv2.CascadeClassifier('haarcascade_smile.xml') #Classifieur pour la detection de la bouche
noseCascade = cv2.CascadeClassifier('haarcascade_nose.xml') #Classifieur pour la detection du nez    

def cadre_face(un_cadre):
    print('x1,y1----+')
    print('|    |')
    print('+-------x2,y2')

    print('x1: ',un_cadre[0][0])
    print('y1: ',un_cadre[0][1])
    print('x2: ',un_cadre[0][0]+un_cadre[0][2])
    print('y2: ',un_cadre[0][1]+un_cadre[0][3])

#Detection des elements et placement des rectangles
    #Recherche visage
faces = faceCascade.detectMultiScale(image, 1.3, 5) #Detection du visage dans l'image
for(xf, yf, wf, hf) in faces: #Definition des coordonnees du visage detecte
    cv2.rectangle(image, (xf,yf), (xf+wf, yf+hf),(0, 0, 255), 1) #Placement du rectangle autour du visage

    roi=image[yf:yf+hf, xf:xf+wf] #Rogner l'image pour que le rectangle du visage soit une image complete
    roi_superieur=image[yf:yf+2*hf/3, xf:xf+wf]
    roi_inferieur=image[yf+2*hf/3:yf+hf, xf:xf+wf]

    
    #Recherche yeux
    eyes=[]
    scalefactor_eyes=3
    while not(len(eyes)==2):
        print(scalefactor_eyes)
        eyes = eyeCascade.detectMultiScale(roi_superieur, scalefactor_eyes, 2)
        print(eyes)
        scalefactor_eyes=scalefactor_eyes-0.1 #Decremente de 10%
        
    centre_yeux=[]
    for (xe, ye, we, he) in eyes: #Definition des coordonnees des yeux detectes
        cv2.rectangle(roi, (xe,ye), (xe+we, ye+he), (0, 255, 0), 1) #Placement des rectangles autour des yeux
        cv2.circle(roi, (int(xe+we/2),int(ye+he/2)), 2, (0, 0, 255), 1)
        centre_yeux.append(xe+we/2)
        centre_yeux.append(ye+he/2)
    
    #Recherche bouche
    mouth=[]
    scalefactor_mouth=3
    while not(len(mouth)==1):
        print(scalefactor_mouth)
        mouth = mouthCascade.detectMultiScale(roi_inferieur, scalefactor_mouth, 2)
        print(mouth)
        scalefactor_mouth=scalefactor_mouth-0.1 #Decremente de 10%
    
    for (xm, ym, wm, hm) in mouth: #Definition des coordonnees de la bouche detectee
        cv2.rectangle(roi, (xm,int(ym+2*hf/3)), (xm+wm, int(ym+2*hf/3+hm)), (255, 0, 0), 1) #Placement du rectangle autour de la bouche
        cv2.circle(roi, (int(xm+wm/2),int(ym+hm/2+2*hf/3)), 2, (0, 0, 255), 1)
        
    
    #Recherche nez
    nose=[]
    scalefactor_nose=3
    while not(len(nose)==1):
        print(scalefactor_nose)
        nose = noseCascade.detectMultiScale(roi, scalefactor_nose, 2)
        print(nose)
        scalefactor_nose=scalefactor_nose-0.1 #Decremente de 10%

    for (xn, yn, wn, hn) in nose: #Definition des coordonnees du nez detecte
        cv2.rectangle(roi, (xn,yn), (xn+wn, yn+hn), (255, 255, 0), 1) #Placement du rectangle autour du nez
        cv2.circle(roi, (int(xn+wn/2),int(yn+hn/2)), 2, (0, 0, 255), 1)

        
#appel de fonction nouvelle pour afficher les coordonnees du visage
cadre_face(faces)

#Dessin des lignes
cv2.line (roi, (int(xn+wn/2),int(yn+hn/2)), (int(xm+wm/2),int(ym+2*hf/3+hm/2)), (0, 0, 255), 2) #Ligne bouche-nez
cv2.line (roi, (int(centre_yeux[0]),int(centre_yeux[1])), (int(centre_yeux[2]),int(centre_yeux[3])), (0, 0, 255), 2) #Ligne oeil-oeil
cv2.line (roi, (int(centre_yeux[0]),int(centre_yeux[1])), (int(xm+wm/2),int(ym+2*hf/3+hm/2)), (0, 0, 255), 2) #Ligne oeil-bouche
cv2.line (roi, (int(centre_yeux[2]),int(centre_yeux[3])), (int(xm+wm/2),int(ym+2*hf/3+hm/2)), (0, 0, 255), 2) #Ligne oeil-bouche

#Mesure de distances
detection=[]
    #Distance nez-bouche
vecteur_nez_bouche_x = ((xm+wm/2)-(xn+wn/2))
vecteur_nez_bouche_y = ((ym+2*hf/3+hm/2)-(yn+hn/2))
distance_nez_bouche = math.sqrt((math.pow(vecteur_nez_bouche_x, 2))+(math.pow(vecteur_nez_bouche_y, 2)))
print(distance_nez_bouche)
detection.append(distance_nez_bouche)

    #Distance oeil-oeil
vecteur_oeil1_oeil2_x = ((centre_yeux[0])-(centre_yeux[1]))
vecteur_oeil1_oeil2_y = ((centre_yeux[2])-(centre_yeux[3]))
distance_oeil1_oeil2 = math.sqrt((math.pow(vecteur_oeil1_oeil2_x, 2))+(math.pow(vecteur_oeil1_oeil2_y, 2)))
print(distance_oeil1_oeil2)
detection.append(distance_oeil1_oeil2)

#Affichage et sauvegarde de l'image capturee
cv2.imwrite('test_detection.jpg',image)
namewindow = 'Visages detectes'
cv2.imshow(namewindow,image)
cv2.resizeWindow(namewindow,800,600)
cv2.waitKey(0)
cv2.destroyWindow(namewindow)

#Base de donnees
#personnages={}


