我有3个使用OpenCV python-的人脸识别代码 1.数据集 2.培训师& 3.检测器 我从youtube获得了这些代码。
数据集
import cv2
import numpy as np
cam = cv2.VideoCapture(0)
cc='haarcascade_frontalface_default.xml'
detector=cv2.CascadeClassifier(cc)
Id=input('enter your id')
sampleNum=0
while(True):
ret, img = cam.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = detector.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
#incrementing sample number
sampleNum=sampleNum+1
#saving the captured face in the dataset folder
cv2.imwrite("dataSet/User."+Id +'.'+ str(sampleNum) + ".jpg",cv2.resize(gray[y:y+h,x:x+w],(120,120)))
cv2.imshow('frame',img)
#wait for 100 miliseconds
if cv2.waitKey(100) & 0xFF == ord('q'):
break
# break if the sample number is morethan 20
elif sampleNum>20:
break
cam.release()
cv2.destroyAllWindows()
这是用于从用户收集数据的代码。
教练
import cv2,os
import numpy as np
from PIL import Image
recognizer = cv2.face.EigenFaceRecognizer_create()
cc="haarcascade_frontalface_default.xml"
detector=cv2.CascadeClassifier(cc)
path = 'dataSet'
def getImagesAndLabels(path):
width_d, height_d = 120, 120 # Declare your own width and height
imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
print(imagePaths)
faceSamples=[]
Ids=[]
for imagePath in imagePaths:
pilImage = Image.open(imagePath).convert('L')
imageNp = np.array(pilImage,'uint8')
Id = int(os.path.split(imagePath)[-1].split(".")[1])
faces = detector.detectMultiScale(imageNp)
for (x,y,w,h) in faces:
imnp=imageNp[y:y+h,x:x+w,(width_d, height_d)
faceSamples.append(cv2.resize(imnp))
Ids.append(Id)
return faceSamples,Ids
faces,Ids = getImagesAndLabels('dataSet')
recognizer.train(faces, np.array(Ids))
recognizer.write('trainner/trainnerEi.yml')
这是用于训练并将数据存储在“ trainner / trainnerEi.yml”文件中的代码。
检测器
import cv2
import numpy as np
recognizer = cv2.face.EigenFaceRecognizer_create()
recognizer.read('trainner/trainnerEi.yml')
cascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath);
cam = cv2.VideoCapture(0)
font = cv2.FONT_HERSHEY_SIMPLEX
fontscale = 1
while True:
ret, im =cam.read()
gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
faces=faceCascade.detectMultiScale(gray, 1.3,5)
for(x,y,w,h) in faces:
cv2.rectangle(im,(x,y),(x+w,y+h),(225,0,0),2)
Id, conf = recognizer.predict(cv2.resize(gray[y:y+h,x:x+w],(120,120)))
if(conf<50):
if(Id==1):
Id="Rajeev"
elif(Id==2):
Id="Sam"
else:
Id="Unknown"
cv2.putText(im, str(Id), (x,y+h),font, fontscale, 255)
cv2.imshow('im',im)
if cv2.waitKey(10) & 0xFF==ord('q'):
break
cam.release()
cv2.destroyAllWindows()
这些代码没有错误,但检测器代码未检测到已知ID。在这里,我使用EigenFaceRecognition识别人脸。