''''
Real Time Face Recogition
==> Each face stored on dataset/ dir, should have a unique numeric integer ID as 1, 2, 3, etc
==> LBPH computed model (trained faces) should be on trainer/ dir
Based on original code by Anirban Kar: https://github.com/thecodacus/Face-Recognition
Developed by Marcelo Rovai - MJRoBot.org @ 21Feb18
'''
import cv2
import numpy as np
import os
# Create Local Binary Pattern Histograms for face recognization
recognizer = cv2.face.LBPHFaceRecognizer_create()
# Read the trained mode
recognizer.read('trainer/trainer.yml')
# Load prebuilt model for Frontal Face
cascadePath = "haarcascade_frontalface_alt2.xml"
# Create classifier from prebuilt model
faceCascade = cv2.CascadeClassifier(cascadePath);
# add the font text
font = cv2.FONT_HERSHEY_SIMPLEX
#iniciate id counter
id = 0
# names related to ids: example ==> Marcelo: id=1, etc
names = ['None', 'dh is cool', 'laoer', 'liyang', 'heqiang', 'xiu']
# Initialize and start realtime video capture
cam = cv2.VideoCapture(0)
#cam.set(3, 640) # set video widht
#cam.set(4, 480) # set video height
# Define min window size to be recognized as a face
#minW = 0.1*cam.get(3)
#minH = 0.1*cam.get(4)
while True:
# Read the video frame
ret, img =cam.read()
#img = cv2.flip(img, -1) # Flip vertically
# Convert the captured frame into grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# Get all face from the video frame
faces = faceCascade.detectMultiScale(
gray,
scaleFactor = 1.2,
minNeighbors = 5,
#minSize = (int(minW), int(minH)),
)
# For each face in faces
for(x,y,w,h) in faces:
# Create rectangle around the face
cv2.rectangle(img, (x-20,y-20), (x+w+20,y+h+20), (0,255,0), 4)
# Recognize the face belongs to which ID
id, confidence = recognizer.predict(gray[y:y+h,x:x+w])
# Check if confidence is less them 100 ==> "0" is perfect match
if (confidence < 100):
id = names[id]
confidence = " {0}%".format(round(100 - confidence))
else:
id = "unknown"
confidence = " {0}%".format(round(100 - confidence))
# put text describe who is in the picture
cv2.putText(img, str(id), (x,y-40), font, 2, (255,255,255), 3)
cv2.putText(img, str(confidence), (x+5,y+h-5), font, 1, (255,255,0), 1)
# Dispaly the video frame with the bounded rectangle
cv2.imshow('camera',img)
# Press 'ESC' for exiting video
k = cv2.waitKey(10) & 0xff
if k == 27:
break
# Do a bit of cleanup
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()