I am trying to run some python 2.7 code with opencv2. Currently if a subject enters the frame the code labels them as the one it looks like most in its photo database. Instead of this I would like it to label untrained faces as "unknown" this is my code so far:
import cv2
import numpy as np
faceDetect=cv2.CascadeClassifier('haarcascade_frontalface_default.xml');
cam=cv2.VideoCapture(0);
rec=cv2.createLBPHFaceRecognizer();
rec.load("recognizer\\trainingData.yml")
id=0
font=cv2.cv.InitFont(cv2.cv.CV_FONT_HERSHEY_SIMPLEX,1,1,0,0)
#font=cv2.cv.InitFont(cv2.cv.CV_FONT_HERSHEY_COMPLEX_SMALL,3,1,0,1)
while (True):
ret, img=cam.read();
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces=faceDetect.detectMultiScale(gray,1.3,5);
for (x,y,w,h) in faces:
#cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)
id,conf=rec.predict(gray[y:y+h, x:x+w])
if(id==1):
id="Admin"
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)
elif(id==2):
id="Sonja"
cv2.rectangle(img,(x,y),(x+w,y+h),(255,255,255),2)
cv2.rectangle(img,(x,y),(x+w,y+h),(255,255,255),2)
cv2.cv.PutText(cv2.cv.fromarray(img),str(id),(x,y+h),font,(255,255,255));
cv2.imshow("Image",img);
if(cv2.waitKey(1)==ord('q')):
break;
cam.release()
cv2.destroyAllWindows()
And the trainer is run through this code:
import os
import cv2
import numpy as np
from PIL import Image
recognizer=cv2.createLBPHFaceRecognizer();
path='dataSet'
def getImagesWithID(path):
imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
faces=[]
IDs=[]
for imagePath in imagePaths:
faceImg=Image.open(imagePath).convert('L');
faceNp=np.array(faceImg,'uint8')
ID=int(os.path.split(imagePath)[-1].split('.')[1])
faces.append(faceNp)
print ID
IDs.append(ID)
cv2.imshow("training",faceNp)
cv2.waitKey(10)
return np.array(IDs), faces
Ids, faces= getImagesWithID(path)
recognizer.train(faces, Ids)
recognizer.save('recognizer/trainingData.yml')
cv2.destroyAllWindows()
I assume that your rec.predict method returns the id of the recognized faces. In which case you can add an 'else' condition in the
for (x,y,w,h) in faces:
loop for the faces that don't have an id, like so:Also, I've implemented the putText method differently than the one you've shown.