图像项目-基于opencv的人脸识别

基于opencv的人脸识别

  • opencv的一个目录:opencv/sources/data/haarcascades 提供了用于人脸检测相关的文件,加载这些文件,就可以方便的实现人脸检测的相关工作。

    face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')
    faces = face_cascade.detectMultiScale(face_gray, 1.3, 5)
    
  • 上述代码就可以实现人脸的区域的检测,face返回人脸矩形框的左上角坐标以及矩形框的长和宽的列表。

图像项目-基于opencv的人脸识别_第1张图片

  • 显然,做人脸识别需要大量的训练数据。一般深度学习识别的训练集数据都是万为单位。我们这里就打算调用摄像头,然后将用上述矩形框里的图像转化为灰度图然后再resize到200*200大小作为训练数据。

  • 下面是获取100张训练图像的代码

    #coding: utf-8
    import cv2
    
    datapath = "D:/imgData/face/"
    
    def generate(name):
        face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')
    #     eye_cascade = cv2.CascadeClassifier('./haarcascade_eye.xml')
        camera = cv2.VideoCapture(0)
        count = 0
        while (True):
            ret, frame = camera.read()
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            #p2:人脸检测中每次迭代图像的压缩率    p3:每个人脸矩形保留近邻数目的最小值ֵ
            faces = face_cascade.detectMultiScale(gray, 1.3, 5)
            for (x,y,w,h) in faces:
                img = cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
    
                f = cv2.resize(gray[y:y+h, x:x+w], (200, 200))
    
                cv2.imwrite(datapath + str(name) + '/%s.pgm' % str(count), f)
                print count
                count += 1
    
            if(count >= 100):
                break
    
            cv2.imshow("camera", frame)
    
            if cv2.waitKey(1000 / 12) & 0xff == ord("q"):
                break
    
        camera.release()
        cv2.destroyAllWindows()
    
        if __name__ == "__main__":
          generate('wjf')
    
  • 训练数据的话都要一个文本文件来指定当前图片属于哪一个类别?caffee是用一个txt文本说明,opencv需要一个csv文件说明。

  • 当然,这个文件肯定需要代码来生成,代码比较简单,就是一些文件的操作。python方便的就是可以用其他的包调用,而且使用起来很方便,跟Java一样。python文件操作一个好用的包就是os了。

  • 下面是生成csv文件的代码:

    #coding: utf-8
    import os 
    dataPath = "D:/imgData/face/"
    #列出文件夹所有文件夹
    dirList = os.listdir(dataPath)
    
    label = -1;
    for name in dirList:
        path = dataPath + str(name) + '/'
        print path 
        cpath = str(path)[16:str(path).rfind('/')+1]
    
        label += 1
        f = open(dataPath+'train.csv', 'a+');
    
        fileList = os.listdir(path)
        for fileName in fileList:
            print fileName
            f.write(cpath + fileName + ';' + str(label) + '\n')   
    
  • 打开这个文件,可以看到其内容如下,有必要的话可以将顺序在打乱一点。
    图像项目-基于opencv的人脸识别_第2张图片

  • 完事具备,接下来就是训练了。opencv提供了三种人脸识别的方法,这里打算用Eigenfaces来实现,它是基于PCA原理的。

  • 使用起来也很简单,传入所有图像数组的list集合X以及对应标签的list。
  • 训练完成后,我们将模型保存到xml文件中去。

    model = cv2.face.createEigenFaceRecognizer()
    model.train(np.asarray(X), np.asarray(y))
    model.save(dataPath  + 'model.xml')
    
  • 模型的预测也很简单了,调用model.predict(img)就可以返回img对应的标签了。

图像项目-基于opencv的人脸识别_第3张图片

  • 如果识别的不稳定,可以增加训练数据。

你可能感兴趣的:(图像项目-基于opencv的人脸识别)