基于OpenCV提供的人脸识别算法LBPH实现人脸识别

这篇具有很好参考价值的文章主要介绍了基于OpenCV提供的人脸识别算法LBPH实现人脸识别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文通过学习LBPH人脸识别算法,简要了解人脸识别技术的原理,实现人脸采集、训练人脸模型实现人脸识别。


一、 LBPH人脸识别算法概述

OpenCV库自带的人脸级联分级器具有很好的人脸检测和人脸追踪效果,它是一个基于Haar特征的Adaboost级联分类器。特别注意,OpenCV库虽然自带人脸级联分级器,但是识别效率一般。本项目使用的是OpenCV提供的人脸识别算法LBPH(Local Binary Pattern Histogram),即局部二进制模式直方图,它属于OpenCV拓展库opencv-contrib的一部分,需要另外单独安装opencv-contrib-python-4.1.2。
LBPH人脸识别算法思路如下:将检测到的人脸分为小单元如下图1所示,并将其与模型中的对应单元进行比较,对每个区域的匹配值产生一个直方图,如图2所示,通过对直方图的比较,算法将能够识别图像的边缘和角,能够识别直方图中哪些代表人的主要特征,比如眼睛的颜色、嘴巴的形状等等,这个算法的基本理论也就是基于直方图的创建和比较。由于这种方法通过比较不同人脸图像LBP编码直方图达到人脸识别的目的,其优点是不会受到光照、缩放、旋转和平移的影响。
lbph算法,python,人脸识别,LBPH,opencv,算法,计算机视觉
提示:二进制是将中间的数值“90”与四周数值进行对比,大于为1,小于为0,然后绕四周逆时针得出二进制10001101
lbph算法,python,人脸识别,LBPH,opencv,算法,计算机视觉
*参考文档:
1.使用LBPH算法理解人脸识别
2.LBPH人脸识别

二、 人脸识别技术原理

一个完整的人脸识别系统包含五个主要部分,即人脸采集(Face Collect)、人脸检测(Face Detection)、人脸配准(Face Alignment)、人脸特征提取(Face Feature Extraction)、人脸识别(Face Recognition)。
lbph算法,python,人脸识别,LBPH,opencv,算法,计算机视觉

人脸采集:

利用摄像机等采集设备拍摄人脸图像。

人脸检测:

人脸检测是检测出图像中人脸所在位置的一项技术,一般情况下就是用一个矩形框把人脸框出来。本项目使用Haar人脸识别分类器检测。

人脸配准:

人脸配准是根据输入的人脸图像,自动定位出人脸上五官关键点坐标的一项技术,一般有5点、68点、90点。

人脸特征提取:

人脸特征提取是将一张人脸图像转化为一串固定长度的数值的过程。
lbph算法,python,人脸识别,LBPH,opencv,算法,计算机视觉

人脸识别:

人脸识别是一种识别出输入人脸图对应身份的算法技术。输入一张人脸图像,通过与注册在库中N个身份对应的特征进行逐个比对,找出“一个”与输入特征相似度最高的特征。
lbph算法,python,人脸识别,LBPH,opencv,算法,计算机视觉

三、 关键模块

1.根据以上分析,本项目将实现人脸识别分为以下3个小任务,通过3个步骤来完成人脸采集与检测、人脸模型训练、人脸识别。
lbph算法,python,人脸识别,LBPH,opencv,算法,计算机视觉
2.函数介绍
在OpenCV中,使用函数cv2.face.LBPHFaceRecognizer_create()生成LBPH人脸识别器实例模型,然后应用cv2.face_FaceRecognizer.train()函数完成训练,最后用cv2.face_FaceRecognizer.predict()函数完成人脸识别。

四、 实验准备

1. 第三方库

lbph算法,python,人脸识别,LBPH,opencv,算法,计算机视觉

2. 新建相关文件夹

新建一个FaceRecognition工程文件夹,在里面Facedata文件夹、cv2data文件夹、Model文件夹
lbph算法,python,人脸识别,LBPH,opencv,算法,计算机视觉
lbph算法,python,人脸识别,LBPH,opencv,算法,计算机视觉

lbph算法,python,人脸识别,LBPH,opencv,算法,计算机视觉

3. 实验环境

(1)摄像头设备。
(2) python3.7(文末提供的安装包是3.7版本的,如果是其他版本,请根据需要升级第三方库)。
备注:文末提供参考程序


五、 人脸采集与检测实现

lbph算法,python,人脸识别,LBPH,opencv,算法,计算机视觉

1.人脸采集与检测FaceCollect.py代码

实现效果见本程序后面

import cv2
import numpy as np
import random

# 将捕获照片的大小裁剪为正方形
def getpaddingSize(shape):
    # 照片的长和宽
    h, w = shape
    longest = max(h, w)
    # 将最长的边进行处理
    result = (np.array([longest]*4, int) - np.array([h, h, w, w], int)) // 2
    return result.tolist()

# 图像去噪处理,使得训练出来的模型具备一定的泛化能力
def dealwithimage(img, h=64, w=64):
    top, bottom, left, right = getpaddingSize(img.shape[0:2])
    img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=[0, 0, 0])
    img = cv2.resize(img, (h, w))
    return img

# 改变亮度与对比度
def relight(imgsrc, alpha=1, bias=0):
    imgsrc = imgsrc.astype(float)
    imgsrc = imgsrc * alpha + bias
    imgsrc[imgsrc < 0] = 0
    imgsrc[imgsrc > 255] = 255
    imgsrc = imgsrc.astype(np.uint8)
    return imgsrc

# 捕获人脸
def GetFace(name,face_id):
    # 0: 笔记本内置摄像头; 1: USB摄像头
    camera = cv2.VideoCapture(0, cv2.CAP_DSHOW)
    # 获取分类器
    face_detector = cv2.CascadeClassifier(r'./cv2data/haarcascade_frontalface_default.xml')
    count = 1
    while True:
        # 默认获取100张图片作为训练数据集
        if(count<=100):
            print("It's processing %s image." % count)
            # 读取图片
            success,img = camera.read()
   
            # 图片灰度化
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            # 检测人脸
            faces = face_detector.detectMultiScale(gray,1.31,2)
            for (x, y, w, h) in faces:
                # 图像预处理,处理成64*64大小的图片
                face = gray[y:y+h, x:x+w]
                face = cv2.resize(face, (64, 64))
                # 图像去噪处理
                face = dealwithimage(face)
                # 改变亮度与对比度
                #face = relight(face, random.uniform(0.5, 1.5), random.randint(-50, 50))
                # 保存图片
                cv2.imwrite("Facedata/User." + str(face_id) + '.' + str(count) + '.jpg', face)
                # 在图片上显示名字
                cv2.putText(img, name, (x, y-20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2)
                # 画一个矩形
                img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
                count+=1
            cv2.imshow('img', img)
            # 保持画面持续
            key = cv2.waitKey(30)&0xff
            # Esc退出
            if key == 27:
                break
        else:
            break
    # 关闭摄像头
    camera.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    # 请输入您的name和id
    name = input('Please input your name:')
    face_id = input('Please input face id:')
    GetFace(name,face_id)  

2.程序执行效果

程序打印下列内容,输入人脸身份(如lyx),其次输入身份ID(序号0,1,2…)。当用户输入名字和ID,按下回车键后,只要用户正对着摄像头计算机会自动采集人脸图像,直到采集到100张有效照片后自动退出,照片默认保存在根目录下的Facedata文件夹

lbph算法,python,人脸识别,LBPH,opencv,算法,计算机视觉
lbph算法,python,人脸识别,LBPH,opencv,算法,计算机视觉


六、 人脸模型训练实现

lbph算法,python,人脸识别,LBPH,opencv,算法,计算机视觉对采集到的人脸数据集进行人脸特征提取并建立人脸模型,形成模型文件。

1.训练人脸模型FaceTrain.py代码

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

# 人脸训练集路径
path = './Facedata/'
# 初始化识别器
# opencv-contrib-python和opencv-python库版本要一致,否则运行会报错
recognizer = cv2.face.LBPHFaceRecognizer_create()
# 获取分类器
detector = cv2.CascadeClassifier(r'./cv2data/haarcascade_frontalface_default.xml')

# 获取图像及标签
def getImagesAndLabels(path):
    # join函数的作用
    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 = 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

# 主程序入口
if __name__ == "__main__":
    print('Training faces. It will take a few seconds. Waiting...')
    faces, ids = getImagesAndLabels(path)
    # 开始训练
    recognizer.train(faces, np.array(ids))         
    print('Training has finished!')
    # 保存文件
    recognizer.write(r'./Model/trainer-2021.yml')  
    print("{0} faces trained. Exiting Program.".format(len(np.unique(ids))))

2.程序执行效果

当出现如下所示的信息时,说明模型训练完成,模型文件默认保存在当前程序目录下的Model文件夹

Training faces. It will take a few seconds. Waiting...
Training has finished!
1 faces trained. Exiting Program.

lbph算法,python,人脸识别,LBPH,opencv,算法,计算机视觉


七、 人脸识别实现

lbph算法,python,人脸识别,LBPH,opencv,算法,计算机视觉

通过摄像头实时捕获人脸图像,进行人脸追踪,跟训练好的人脸模型trainer-20221230.yml进行特征匹配,从而进行人脸识别,对应的用户名字会实时显示在人脸图像上。

1.人脸识别FaceRecognition.py代码

import os
import cv2

# 人脸识别函数
def Face():
    # 获取所有的模型文件路径
    model_dir = './Model/'
    # 获取分类器
    faceCascade = cv2.CascadeClassifier(r'./cv2data/haarcascade_frontalface_default.xml')
    # 设置图片显示的字体
    font = cv2.FONT_HERSHEY_SIMPLEX

    # 用户需要在此添加自己的姓名(拼音),下标序号要与名字对应(ID从0开始,依次递增)
    names = ['lyx', 'jk', 'xy']

    # 捕获图像
    camera = cv2.VideoCapture(0, cv2.CAP_DSHOW)
    # 设置格式
    minW = 0.1*camera.get(3)
    minH = 0.1*camera.get(4)

    # 初始化识别器
    recognizer = cv2.face.LBPHFaceRecognizer_create()
    # 加载训练好的模型文件

    print('请正对着摄像头...')
    confidence = 150.00
    name = "unknown"
    while True:
        # 读取图片
        success,img = camera.read()
        # 图片灰度化
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        # 检测人脸
        faces = faceCascade.detectMultiScale(
            gray,
            scaleFactor=1.3,
            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)
            # 遍历指定目录下的所有模型文件,能够根据不同模型识别不同人,但是有些卡
            for model_file in os.listdir(model_dir):
                if not model_file.endswith('.yml'):  #如果文件夹内的文件格式不是.yml,就跳过
                    continue
                # 初始化识别器
                recognizer = cv2.face.LBPHFaceRecognizer_create()           
                recognizer.read(r'./Model/'+ model_file)
                # 图像预测 https://www.py.cn/jishu/jichu/26805.html
                # predict()函数返回两个元素的数组:第一个元素是所识别个体的标签,第二个是置信度评分。
                # 置信度评分用来衡量所识别人脸与原模型的差距,0 表示完全匹配。
                idnum, confidence = recognizer.predict(gray[y:y+h, x:x+w])     
                print(confidence)      
                # 设置置信度confidence小于100%即可验证通过人脸   
                if confidence < 120:
                    name = names[idnum]
                    print("ID:",idnum,",name:",name)
                    break
                else:
                    name = "unknown"
            cv2.putText(img, str(name), (x+5, y-5), font, 1, (230, 250, 100), 1)
            cv2.putText(img, str(confidence), (x+5, y+h-5), font, 1, (255, 0, 0), 1)
        cv2.imshow('camera', img)
        # 保持画面持续
        key = cv2.waitKey(10)
        # 按Esc键退出
        if key==27 or confidence< 120:
            cv2.imwrite('./Image.jpg', img)  #保存图片               
            break
    # 关闭摄像头
    camera.release()
    cv2.destroyAllWindows()
    return name,idnum,confidence

if __name__ == '__main__':
    # 加载训练好的模型文件
    
    name,confidence = Face()
    confidence = "{0}%".format(round(200 - confidence))
    print("您的名字是:", name)
    print("匹配指数:", confidence)


2.关于置信度confidence

LBPH中置信度评分用来衡量所识别人脸与原模型的差距,0 表示完全匹配,predict()函数返回两个元素的数组:第一个元素是所识别 个体的标签,第二个是置信度评分。其中由于本人采集人脸数据的干扰,confidence的值会在88-110以上(confidence想要接近0基本上概率为0),所以我设置了本项目score为200-confidence,反过来判断score的值大于我设定的阈值(95)那么就判定为人脸识别成功。

3.程序执行效果

在弹出图像窗口并在人脸图像上实时显示用户名和匹配指数。
lbph算法,python,人脸识别,LBPH,opencv,算法,计算机视觉

程序链接

完成参考程序与第三方库:
链接:https://pan.baidu.com/s/1woGOnY8YWWfWSAQI6yldwg?pwd=lyx4
提取码:lyx4文章来源地址https://www.toymoban.com/news/detail-777615.html

到了这里,关于基于OpenCV提供的人脸识别算法LBPH实现人脸识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【OpenCV-Python】——Haar人脸检测&深度学习人脸检测&EigenFaces/FisherFaces/LBPH人脸识别

    目录 前言: 1、人脸检测 1.1 基于Haar的人脸检测 1.2 基于深度学习的人脸检测

    2024年02月05日
    浏览(41)
  • 【计算机视觉40例】案例29:LBPH人脸识别

    【 导读 】本文是专栏《计算机视觉 40 例简介》的第 29 个案例《 LBPH 人脸识别 》。该专栏简要介绍李立宗主编《计算机视觉 40 例——从入门到深度学习( OpenCV-Python )》一书的 40 个案例。 目前,该书已经在电子工业出版社出版,大家可以在京东、淘宝、当当等平台购买。

    2024年02月06日
    浏览(31)
  • 基于树莓派和opencv实现人脸识别

    源码我放在github上了 https://github.com/FjnuThomas/-opencv- 各位哥哥姐姐clone代码别忘了给个小心心哦😘 前言 一、人脸检测 二、图像采集 三、开始训练 四、人脸识别 总结 我们这学期选修了一门嵌入式Linux,期末选择了基于树莓派和opencv实现人脸识别作为期末作业。为了展示的方便

    2023年04月23日
    浏览(34)
  • 基于MFC和OpenCV实现人脸识别

    笔记主要参考B站视频“【C语言项目】软件开发:人脸识别”。 项目原理速览查看B站视频“【学习笔记】基于OpenCV实现人脸识别的原理讲解”。 可能会用到的资料有如下所示,下载链接见文末: 《奇牛编程-人脸识别资料》 1 ,但是其中有一些命名错误可能会导致程序调用失

    2024年02月07日
    浏览(31)
  • 基于OpenCv和tensorflow的人脸识别设计与实现

    项目名称: 基于OpenCv和tensorflow的人脸识别 项目地址:https://gitee.com/yq233/opencv 环境配置: Python tensorflow2 OpenCv categories: 人工智能 description: Opencv是一个开源的的跨平台计算机视觉库,内部实现了图像处理和计算机视觉方面的很多通用算法,对于python而言,在引用opencv库的时候需要

    2024年02月03日
    浏览(38)
  • Android基于opencv4.6.0实现人脸识别功能

    步骤: 1.整合opencv 2.获取相机的SurfaceView传到native层去检测(亦或是不断的获取SurfaceView的Bitmap,传到native层) 3.检测人脸,在本地保存人脸特征信息 4.上传至后台(不实现) 人脸识别实现的思路(例:人脸登录) 1.人脸信息录入 1.1获取相机的Bitmap,检测人脸(保证人脸信息比较精准

    2024年02月03日
    浏览(36)
  • 基于opencv和python的人脸识别签到系统设计与实现

    收藏和点赞,您的关注是我创作的动力   人脸识别广泛的应用于各个领域。一般来说,人脸具有人类基因、指纹等独特的生物学特性,因此可以作为生物特征识别,从而方便、快速、准确地识别被摄体,可见人脸识别是一种有效的身份识别工具。该技术可以应用于任何需要

    2024年02月04日
    浏览(36)
  • python基于opencv和tkinter实现人脸识别【内附完整代码】

    人脸识别技术已经在许多领域得到了广泛应用,例如安防、金融、医疗等等。人脸识别可以帮助我们识别和验证一个人的身份,这是一项非常重要的任务。本篇博客将介绍如何使用Python和OpenCV库进行人脸识别。我们将学习如何使用OpenCV中的人脸检测器检测图像中的人脸,如何

    2023年04月14日
    浏览(29)
  • 毕业设计——基于OpenCV的视频人脸识别检测系统的设计与实现

    如需完整源码,可以联系博主获取 本系统基于OpenCV使用Haar级联与dlib库进行人脸检测及实时跟踪,应用LBPH算法开发了一个功能相对完整的人脸识别系统。系统采用sqlite3进行序列化数据存储,能够对陌生人脸闯入进行报警,并拥有基于PyQt5设计的GUI实现。 一、引言 随着计算机

    2024年04月12日
    浏览(35)
  • 毕业设计——基于python-contrib-opencv的人脸识别及检测系统设计与实现(实现电脑端摄像头读取视频,实时人脸录入,人脸检测,人脸识别等功能)

    如需完整源码,可以联系博主获取 基于python-contrib-opencv,dlib,pyqt5。能够实现电脑端摄像头读取视频,实时人脸录入,人脸检测,人脸识别等功能。 一、引言 随着计算机视觉和人工智能技术的不断发展,人脸识别技术已成为智能安防、身份验证等领域的关键技术之一。而基于

    2024年04月12日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包