用OpenCV-Python自带的LBPH识别器实现简单人脸识别(下)

用OpenCV-Python自带的LBPH识别器实现简单人脸识别(下),第1张

用OpenCV-Python自带的LBPH识别器实现简单人脸识别(下)

本文主要是代码展示,如果想看详细教程请移步(上)篇

1.数据的收集
#使用之前请现在根目录创建data文件夹,然后改你自己的分类器路径
#使用方法,填入ID号和姓名,然后看摄像头就行
def get_data(id,name):
    camera = cv2.VideoCapture(0)  
    flag, img = camera.read()
    face_cascade = cv2.CascadeClassifier('G:/opencv/build/etc/haarcascades/haarcascade_frontalface_default.xml')
    print("开始记录数据 \n")
    num = 0  # 设置录入照片的初始值
    num_picture = 50 #要读取的照片数量
    while True:
        ret, frame = camera.read()
        if ret is True:
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        else:
            break
        face_detector = face_cascade
        faces = face_detector.detectMultiScale(gray, 1.3, 5,minSize=(100,100))
        check = np.array(faces)	#防止未检测到人脸导致数据不全
        if check.sum() > 0:
            num += 1 
            for (x, y, w, h) in faces:
                cv2.rectangle(frame, (x, y), (x + w, y + w), (255, 0, 0))
                gray = gray[y:y + h, x:x + w]
                gray = cv2.resize(gray, dsize=(500, 500))
                cv2.imwrite("./data/" + str(id) + str(name) + '.' + str(num) + '.jpg', gray)
        if num > num_picture:
            break
2.数据训练

(1)整合ID与图像

def get_id_img():
    path = 'data/'
    facesamples = []
    ids = []
    imagepaths = [os.path.join(path, f) for f in os.listdir(path)]  # 储存图片信息
    face_detector = cv2.CascadeClassifier('G:/opencv/build/etc/haarcascades/haarcascade_frontalface_default.xml')
    for imagePath in imagepaths:
        gray = cv2.imread(imagePath,cv2.IMREAD_GRAYSCALE)
        img_numpy = np.array(gray, 'uint8')
        id = int(os.path.split(imagePath)[1].split('.')[0])
        ids.append(id)
        facesamples.append(img_numpy)
    return facesamples, ids
#用法:
images,id = get_id_img()

(2)训练函数

#使用前在根目录下创建 trainer文件夹
def train():
    images,ids = get_id_img()
    recognizer = cv2.face.LBPHFaceRecognizer_create()
    recognizer.train(images, np.array(ids))
    recognizer.write('trainer/trainer.yml')   # 保存生成的人脸特征数据文件
3.部署
def predict(img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换为灰度图像
    face_detector = cv2.CascadeClassifier('G:/opencv/build/etc/haarcascades/haarcascade_frontalface_default.xml')  # 加载分类器
    recogizer = cv2.face.LBPHFaceRecognizer_create()
    recogizer.read('trainer/trainer.yml')
    face = face_detector.detectMultiScale(gray, 1.3, 5, cv2.CASCADE_SCALE_IMAGE)
    check = np.array(face)
    if check.sum() > 0:
        for x, y, w, h in face:
            cv2.rectangle(img, (x, y), (x+w, y+h), color=(0, 0, 255), thickness=2)
            gray = gray[y:y + h, x:x + w]
            gray = cv2.resize(gray,dsize=(500,500))
            id, confidence = recogizer.predict(gray)
            print(id)
            print(confidence)
            if (confidence > 50):
                cv2.putText(img,'unknow', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
            else:
                cv2.putText(img,str(names[id-1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
    cv2.imshow('result', img)

然后读取图片啥的我就不说了,相信大家都明白。

4.结语

这个分类效果吧,说实话非常一般,但是可以用,过几天我会用百度paddle深度学习框架,给大家搭建一个自己的网络训练,大家有什么问题也可以在底下评论区留言。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/801014.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-07
下一篇 2022-05-07

发表评论

登录后才能评论

评论列表(0条)

保存