我试图用opencv2运行一些python 2.7代码。当前,如果某个对象进入框架,则代码会将其标记为在其照片数据库中看起来最像的框架。取而代之的是,我希望将未经训练的人脸标记为“未知”,这是到目前为止的代码:
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()
培训师将通过以下代码运行:
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()
最佳答案
我假设您的rec.predict方法返回识别出的面孔的ID。在这种情况下,您可以在for (x,y,w,h) in faces:
循环中为没有ID的面孔添加“else”条件,例如:
if(id==1):
id="Admin"
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)
cv2.putText(img,"Admin",x+h/2,y+w+40),cv2.FONT_HERSHEY_SIMPLEX,0.6,(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.putText(img,"Sonja",x+h/2,y+w+40),cv2.FONT_HERSHEY_SIMPLEX,0.6,(255,255,255),2)
else:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)#Red
cv2.putText(img,"Unknown",(x+h/2,y+w+40),cv2.FONT_HERSHEY_SIMPLEX,0.6,(0,0,255),2)
另外,我实现的putText方法与您展示的方法不同。