Simple face recognition based on opencv3

我使用的语言为python,识别率不高,只是简单实现了人脸识别的步骤,参考<OpenCV3 计算机视觉>,部分的opencv库接口有所改变.

import cv2
import os
 
def generate(dirname):
     
    face_cascade = cv2.CascadeClassifier(‘/home/yuanqi/opencv-3.4.6/yuanqi opencv/cascades/haarcascade_frontalface_default.xml‘)
    eye_cascade = cv2.CascadeClassifier(‘/home/yuanqi/opencv-3.4.6/yuanqi opencv/cascades/haarcascade_eye_tree_eyeglasses.xml‘)
    if(not os.path.isdir(dirname)):
        os.makedirs(dirname)
  
    camera = cv2.VideoCapture(0)
    count = 0
    while (True):
        ret, frame = camera.read()
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        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(dirname+‘/%s.pgm‘ % str(count), f)
            print(count)
            count += 1
 
        cv2.imshow("camera", frame)
        if cv2.waitKey(100) & 0xff == ord("q"):
            break
        elif count > 20:
            break
 
    camera.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    generate("/home/yuanqi/opencvname/jm")

import sys
import os.path
if __name__ == "__main__":
    BASE_PATH="/home/yuanqi/opencvname"
    
    SEPARATOR=";"
 
    fh = open("/home/yuanqi/opencvname/jm/at.text",‘w‘)
 
    label = 0
    for dirname, dirnames, filenames in os.walk(BASE_PATH):
        for subdirname in dirnames:
            subject_path = os.path.join(dirname, subdirname)
            for filename in os.listdir(subject_path):
                abs_path = "%s/%s" % (subject_path, filename)
                print ("%s%s%d" % (abs_path, SEPARATOR, label))
                fh.write(abs_path)
                fh.write(SEPARATOR)
                fh.write(str(label))
                fh.write("\n")      
            label = label + 1
    fh.close()




import cv2,os,sys
import numpy as np

def read_images(path, sz = None):
    c = 0
    X, y = [], []

    for dirname, dirnames, filenames in os.walk(path):
        for subdirname in dirnames:
            subject_path = os.path.join(dirname, subdirname)
            for filename in os.listdir(subject_path):
                try:
                    if not filename.endswith(‘.pgm‘):
                        continue
                    filepath = os.path.join(subject_path, filename)
                    im = cv2.imread(filepath, cv2.IMREAD_GRAYSCALE)
                    if sz is not None:
                        im = cv2.resize(im,(200,200))
                    X.append(np.asarray(im, dtype=np.uint8))
                    y.append(c)
                except:
                    print("Unexpected error:",sys.exc_info()[0])
            c = c + 1
    return [X, y]

def face_rec(img_path):
    names = [‘rabbit‘]
    [X,y] = read_images(img_path)
    y = np.asarray(y, dtype=np.int32)
    model = cv2.face.EigenFaceRecognizer_create()
    model.train(np.asarray(X), np.asarray(y))

    camera = cv2.VideoCapture(0)
    face_cascade = cv2.CascadeClassifier(
            r‘/home/yuanqi/opencv-3.4.6/yuanqi opencv/cascades/haarcascade_frontalface_default.xml‘)
    while (True):
        read, img = camera.read()
        faces = face_cascade.detectMultiScale(img, 1.3, 5)
        for (x, y, w, h) in faces:
            img = cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            roi = gray[x: x+w, y: y+h]
            try:
                roi = cv2.resize(roi, (200, 200), interpolation=cv2.INTER_LINEAR)
                params = model.predict(roi)
                print("Label: %s, Confidence: %.2f" % (params[0], params[1]))
                cv2.putText(img, names[params[0]], (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2)
            except:
                continue
        cv2.imshow("camera", img)
        if cv2.waitKey(1000 // 12) & 0xff == ord(‘q‘):
            break
    cv2.destroyAllWindows()

if __name__ == "__main__":
    face_rec(r‘/home/yuanqi/opencvname‘)

相关推荐