
from time import sleep
from io import BytesIO
import os
import serial

try:
    import numpy as np
    from picamera import PiCamera
    import cv2
    
except Exception as ex:
    print('[ Error ] some depandincies are missing\n'+ str(ex.args))

def init():
	go = True
	print('Initilizing Camera and cascade components..')
	try:
		camera = PiCamera()
		camera.resolution = (640, 480)
		sleep(2)
		print('[ OK ] Camera')
	except:
		print('[ Error ] Can not initialize PiCamera')
		go = False

	try:
		face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
		sleep(1)
		print('[ OK ] CascadeClassifier')
	except:
		print('[ Error ] Can not load cascade File')
		go = False
	if (go):
		print('Starting Photo loop..')
		start(camera, face_cascade)
		
	else: 
		print('closing')
	#else:
		#print('Sensors not Satisfied')
	
def start( camera, face_cascade):
	j = 0
	while True:
	#try:
		camera.capture('img.jpg')			
		img = cv2.imread('img.jpg',1)
		gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)		
		faces = face_cascade.detectMultiScale(gray, 1.1, 4)			
		i = 0;
		for (x,y,w,h) in faces:
			i += 1
			j += 1 				
			roi_gray = gray[y:y+h, x:x+w]
			roi_color = img[y:y+h, x:x+w]
			#try:
				#cv2.imwrite('train/'+str(j)+'.jpg',img)
				#print(j)
			#except Exception as ex:
				#print(ex)
			#print('Drawing on face ', i)
			person = recognize(roi_gray)
			if person == 'Hesham' or person == 'Saeed':
				OpenShifter()
				print('Sending to Arduino!')
			cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
			cv2.putText(img, person, (x, y), cv2.FONT_HERSHEY_PLAIN, 1.7, (255, 0, 0), 2)
			
		cv2.imshow('image',img) 
		cv2.waitKey(100)
		if cv2.waitKey(1) & 0xFF == ord('q'):
			cv2.destroyAllWindows()
			break
		
		#except:
			#print('[ Error ] Unexpected exception')
			#print('Closing')
			#break
			
def train(number):

	train_path = 'train/'
	face_recognizer = cv2.createLBPHFaceRecognizer()
	images = []
	labels = []
	image_names = os.listdir(train_path)
	for image_name in image_names:
		if image_name.startswith("."):
			continue;
		image_path = train_path + image_name
		image = cv2.imread(image_path)
		gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
		images.append(gray)
		labels.append(number)
	print('training')
	face_recognizer.train(images, np.array(labels))
	face_recognizer.save('faces/hesham')
	

def recognize(image):
	
	subjects = ['','Hesham','Saeed']
	face_recognizer = cv2.createLBPHFaceRecognizer()
	face_recognizer.load('faces/test1')
	img = image.copy()	
	label= face_recognizer.predict(img)
	print(label)
	if label[0] == 1 and int(label[1]) < 120:
		return 'Hesham'
	elif label[0] == 2 and int(label[1]) < 90:
		return 'Saeed'
	elif label[0] == 3 and int(label[1]) < 120:
		return 'Hesham2'
	else:
		return 'Unknown'
			
def OpenShifter():
	try:
		ser = serial.Serial('/dev/ttyUSB1',9600)
		#ser.open()
		ser.write('O')
		ser.close()
	except Exception as ex:
		print('[ Error ] Can not connect to Arduino at /dev/ttyUSB1 .. \n Trying /dev/ttyUSB0')
		try:
			ser = serial.Serial('/dev/ttyUSB0',9600)
			ser.open()
			ser.write('O')
			ser.close()
		except Exception as ex:
			print('[ Error ] Can not connect to Arduino at /dev/ttyUSB0')
	    

init()
