使用Opencv Python进行人脸识别

时间:2019-03-31 15:58:55

标签: python-3.x opencv3.0

我有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识别人脸。

0 个答案:

没有答案