基于Python+opencv实现的人脸识别系统

前言:因为python课设我选择的是关于人脸识别的这个课题,然后做出来也是根据一些博客主们的经验,其中自己也踩了一些坑,然后自己也想写一个关于这个课题的一些总结,讲一下在其中存在的一些问题,以及怎样解决的办法。

文章目录

  • 一、opencv中的LBPH识别原理是什么?
  • 二、使用步骤
    • 1.准备工作
    • 2.完整代码

一、opencv中的LBPH识别原理是什么?

        其实opencv提供了三种人脸识别的方法,分别是LBPH方法、EigenFishfaces方法、Fisherfaces方法。为什么我们这里使用的是这个LBPH方法,原因是:LBPH是其中唯一允许模型样本人脸与摄像头检测到的人脸在形状、大小上可以不同的人脸识别算法。

        LBPH所使用的模型基于LBP算法,其基本原理是将图像(灰度图,如果是彩色图则先转为灰度图)中某个像素点的值与其最临近的3×3邻域8个像素点的值逐一比较,如果该点像素值大于其邻近点的像素值,则得到0,反之,如果该点像素值小于其临界点的像素值,则得到1,最后,将该像素点与其周围8个像素点比较所得到的0和1组合,并依次排列,得到一个8位的二进制序列,将该二进制序列转换为十进制数作为该像素点的LBP值。

基于Python+opencv实现的人脸识别系统_第1张图片

 

        上述就是原始的LBPH算法,后续又有人将其改进,现在在opencv支持下我们可以直接调用函数创建一个LBPH人脸识别的模型。

        具体的LBPH识别原理可以自己去查一下,因为这里我们这里是直接使用的,但是在老师检验时,你需要简单的说明其实现原理。

二、使用步骤

1.准备工作

1.导入四个第三方库:pencv-python;numpy;image;opencv-contrib-python 

2.在下载好的opencv库data文件夹下找到 Haarcascade-frontalface-default.xml 文件,并拉入你建立的项目文件下,注意找这个文件这里有个坑,你要注意你的解释器,一般pycharm下载就是在你项目文件夹下的\venv\Lib\site-packages\cv2\data位置下。如果你是在python的IDLE中下载的那就在你安装的python位置的Lib\site-packages\cv2\data下。总之就这两个位置。

基于Python+opencv实现的人脸识别系统_第2张图片

 3.建立好相关文件夹,将找到的Haarcascade-frontalface-default.xml 文件拖到项目文件中,建立一个data文件夹存放人脸数据

 基于Python+opencv实现的人脸识别系统_第3张图片

 

2.完整代码

代码如下:

import cv2
import os
import numpy as np
from PIL import Image

face_detector = cv2.CascadeClassifier(r"C:\PycharmProjects\pythonProject3\haarcascade_frontalface_default.xml")

#人脸采集
def data_collection():
    cap = cv2.VideoCapture(0)
    face_id = input('请输入你的ID:')
    print(' 数据初始化中,请直视摄像机录入数据....')
    count = 0
    while cap.isOpened():
        ret, frame = cap.read()
        if ret is True:
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        else:
            break
        faces = face_detector.detectMultiScale(gray, 1.3, 5)
        for (x, y, w, h) in faces:
            cv2.rectangle(frame, (x, y), (x + w, y + w), (255, 0, 0))
            count += 1
            cv2.imwrite("C:\PycharmProjects\pythonProject3\data/" + str(face_id) + '.' + str(count) + '.jpg',
                        gray[y:y + h, x:x + w])
            cv2.imshow('image', frame)
        k = cv2.waitKey(1)
        if k == 27:
            break
        elif count >= 100:
            break
    cap.release()
    cv2.destroyAllWindows()

# 人脸数据训练
def face_training():
    # 人脸数据路径
    path = 'data/'
    recognizer = cv2.face.LBPHFaceRecognizer_create()

    def getImagesAndLabels(path):
        imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
        faceSamples = []
        ids = []
        for imagePath in imagePaths:
            PIL_img = Image.open(imagePath).convert('L')
            img_numpy = np.array(PIL_img, 'uint8')

            id = int(os.path.split(imagePath)[-1].split(".")[1])
            faces = face_detector.detectMultiScale(img_numpy)

            for (x, y, w, h) in faces:
                faceSamples.append(img_numpy[y:y + h, x: x + w])
                ids.append(id)
        return faceSamples, ids
    print('数据训练中')
    faces, ids = getImagesAndLabels(path)
    recognizer.train(faces, np.array(ids))
    recognizer.save(r'.\trainer.yml')

#人脸识别
def face_ientification():
    cap = cv2.VideoCapture(0)
    recognizer = cv2.face.LBPHFaceRecognizer_create()
    recognizer.read('./trainer.yml')
    font = cv2.FONT_HERSHEY_SIMPLEX
    idm=0
    names = ['xupei', '1','2']

    cam = cv2.VideoCapture(0)
    minW = 0.1 * cam.get(3)
    minH = 0.1 * cam.get(4)

    while True:
        ret, img = cam.read()
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        faces = face_detector.detectMultiScale(
            gray,
            scaleFactor=1.2,
            minNeighbors=5,
            minSize=(int(minW), int(minH))
        )
        for (x, y, w, h) in faces:
            cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
            id, confidence = recognizer.predict(gray[y:y + h, x:x + w])

            if confidence < 100:
                id = names[idm]
                confidence = "{0}%".format(round(100 - confidence))
            else :
                id = "unknown"
                confidence = "{0}%".format(round(100 - confidence))
            cv2.putText(img, str(id), (x + 5, y - 5), font, 1, (0, 0, 255), 1)
            cv2.putText(img, str(confidence), (x + 5, y + h - 5), font, 1, (0, 0, 0), 1)

        cv2.imshow('camera', img)
        k = cv2.waitKey(10)
        if k == 27:
            cap.release()
            cv2.destroyAllWindows()
            break

while True:
    a = int(input("输入1,录入脸部,输入2进行识别:"))
    if a == 1:
        data_collection()
        face_training()
    elif a == 2:
        face_ientification()

 人脸识别代码相关参考:

基于Python3.7和opencv的人脸识别(含数据收集,模型训练) - xp123 - 博客园

OpenCV--基于python人脸LBPH识别_獜洛橙的博客-CSDN博客_opencv人脸识别lbph

你可能感兴趣的:(python,opencv,计算机视觉,人工智能)