OpenCV11:人脸识别

import os
import sys
import numpy as np 
import cv2 as cv 
import sklearn.preprocessing as sp 

def search_faces(directory):
    if not os.path.isdir(directory):
        raise IOError('The directory"' + directory + '"doesn‘t exist!')
    faces = {}
    for curdir,subdirs,files in os.walk(directory):
        for jpeg in (file for file in files if file.endswith('.jpg')):
            path = os.path.join(curdir,jpeg)
            label = path.split(os.path.sep)[-2]
            if label not in faces:
                faces[label] = []
            faces[label].append(path)
    return faces
def train_codec(labels):
    codec = sp.LabelEncoder()
    codec.fit(labels)
    return codec

def load_detectors():
    face_detector = cv.CascadeClassifier('/Users/youkechaung/Desktop/算法/数据分析/AI/day02/day02/data/haar/face.xml')
    return face_detector

def read_image(filename):
    image = cv.imread(filename)
    return image

def bgr2gray(image):
    image = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    return image 

def detect_regions(detector,image):
    regions = detector.detectMultiScale(image,1.1,2,minSize=(100,100))
    return regions

def encode(codec,label):
    code = int(codec.transform([label])[0])
    return code 

def show_image(title,image):
    cv.imshow(title,image)

def decode(codec,code):
    label = codec.inverse_transform(code)
    return label

def wait_escape(delay=0):
    return cv.waitKey(delay)==27

def read_data(directory):
    faces = search_faces(directory)
    codec = train_codec(list(faces.keys()))
    face_detector = load_detectors()
    x,y,z = [],[],[]
    for label,filenames in faces.items():
        for filename in filenames:
            print(filename,'->',label)
            original = read_image(filename)
            gray = bgr2gray(original)
            faces = detect_regions(face_detector,gray)
            for l,t,w,h in faces:
                x.append(gray[t:t+h,l:l+w])
                y.append(encode(codec,label))
                a,b = int(w/2),int(h/2)
                cv.ellipse(original,(l+a,t+b),(a,b),0,0,360,(255,0,255),2)
                z.append(original)
    y = np.array(y)
    return codec,x,y,z

def train_model(x,y):
    model = cv.face.LBPHFaceRecognizer_create()
    model.train(x,y)
    return model

def pred_model(model,x):
    y = []
    for face in x:
        model.predict(face)[0]
    return y 

def show_labels(codec,codes,pred_codes,images):
    escape=False
    while not escape:
        for code,pred_code,image in zip(codes,pred_codes,images):
            cv.putText(image,'{}{}{}'.format(decode(codec,code),
                '==' if code==pred_code else '!=',
                decode(codec,pred_code)),(10,60),
                cv.FONT_HERSHEY_SIMPLEX,2,(255,255,255),6)
            show_image('Recognizing Face...',image)
            if wait_escape(1000):
                escape=True
                break

def main(argc,argv,envp):
    codec,train_x,train_y,train_z = read_data('/Users/youkechaung/Desktop/算法/数据分析/AI/day02/day02/data/faces/training')
    _,test_x,test_y,test_z = read_data('/Users/youkechaung/Desktop/算法/数据分析/AI/day02/day02/data/faces/testing')
    model = train_model(train_x,train_y)
    pred_test_y = pred_model(model,test_x)
    show_labels(codec,test_y,pred_test_y,test_z)
    return 0

if __name__ == '__main__':
    sys.exit(main(len(sys.argv),sys.argv,os.environ))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值