opencv项目_人脸识别_LBPH_python

Local Binary Pattern Histogram人脸识别器(文末有全部代码)

Looul Biay Patem Hstogam简称LBPH,翻译过来就是局部二值模式直方图,这是一种基于局部二值模式算法,善于捕获局部纹理特征。开发者需要通过三个方法来完成人脸识别操作。
(I)通过0v2 Ree. LERCRCe. Ctato方法创建LBPH人脸识别器,其语法如下,
recognizer = cv2. face. LBPHFaceRecognizer_ create(radius,neighoors,grid_x,grid_ y, threshold)
参数说明:

radius: 可选参数,圆形局部二进制模式的半径,建议使用默认值。
neighbors :可选参数,圆形局部二进制模式的采样点数目,建议使用默认值。


返回值说明:

grid_x:可选参数,水平方向上的单元格数,建议使用默认值。
grid_y: 可选参数,垂直方向上的单元格数,建议使用默认值。
threshold: 可选参数,人脸识别时使用的阈值,建议使用默认值。

(2)创建完识别器对象之后,需要通过对象的train() 方法来训练识别器。建议每个人都给出2张
以上的照片作为训练样本。train() 方法的语法如下:

recognizer . train(src, labels)

对象说明:

recognizer: 已有的LBPH人脸识别器对象。

参数说明:

src:用来训练的人脸图像样本列表,格式为list. 样本图像必须宽高一致。
labels: 样本对应的标签,格式为数组,元素类型为整数。数组长度必须与样本列表长度相同样本与标签按照插入顺序一一对应。

(3)训练完识别器之后就可以通过识别器的predict()方法来识别人脸了,该方法会对比样本的
给出最相近的结果和评分,其语法如下:

abel, confidence = recognizer . predict(src)

对象说明:

recognizer:已有的LBPH人脸识别器对象。

参数说明:

src: 需要识别的人脸图像,该图像宽高必须与样本一致。

返回值说明:

label:与样本匹配程度最高的标签值
confidence:匹配1程度最高的信用度评分。评分小于50就可以认为匹配程度较高,0分表示两幅图像完全一样。

具体使用方法:

capture=cv2.VideoCapture(1,cv2.CAP_DSHOW)

这里的参数“1”指的是外置摄像头, 就是如下图所示,如果你想用笔记本自带的摄像头,请把这里的“1”改为“0”
 创建训练器:

while capture.isOpened():
    ret,image=capture.read() #读取图片
    faceCascade=cv2.CascadeClassifier("cascades\\haarcascade_frontalface_default.xml")
    faces=faceCascade.detectMultiScale(image)

    photos = list()
    lables = list()
    photos.append(cv2.imread("photo\\0.jpg",0))
    photos.append(cv2.imread("photo\\1.jpg",0))
    photos.append(cv2.imread("photo\\2.jpg",0))
    photos.append(cv2.imread("photo\\3.jpg",0))
    photos.append(cv2.imread("photo\\4.jpg", 0))
    photos.append(cv2.imread("photo\\5.jpg", 0))
    photos.append(cv2.imread("photo\\6.jpg", 0))
    photos.append(cv2.imread("photo\\7.jpg", 0))
    lables.append(0)
    lables.append(1)
    lables.append(2)
    lables.append(3)
    lables.append(4)
    lables.append(5)
    lables.append(6)
    lables.append(7)
    recognizer=cv2.face.LBPHFaceRecognizer_create()  #创建识别器
    recognizer.train(photos,np.array(lables))  #训练识别器

    gray_image=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    lable,confidence=recognizer.predict(gray_image)  #分析图像

判断谁是谁:

这里我设的分值高于60证明我是“我”,也就是Guff_hys“”否则是”None”

   if confidence<60:
        for (x, y, w, h) in faces:
            cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 255), 5)
            cv2.putText(image,"None",(x,y),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2)
    else:
        for (x, y, w, h) in faces:
            cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 255), 5)
            cv2.putText(image, "Guff_hys", (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

    cv2.imshow("video", image)
    key=cv2.waitKey(1)
    if key==32:
        break

效果展示:

 需要做的准备:

1:准备至少两张照片(照片越多效果越好)

2:照片准备的要求:照片像下图一样整体露出,且只有一个脸

全部代码:

import cv2 as cv2
import numpy as np
capture=cv2.VideoCapture(1,cv2.CAP_DSHOW)
index=0
while capture.isOpened():
    ret,image=capture.read() #读取图片
    faceCascade=cv2.CascadeClassifier("cascades\\haarcascade_frontalface_default.xml")
    faces=faceCascade.detectMultiScale(image)

    photos = list()
    lables = list()
    photos.append(cv2.imread("photo\\0.jpg",0))
    photos.append(cv2.imread("photo\\1.jpg",0))
    photos.append(cv2.imread("photo\\2.jpg",0))
    photos.append(cv2.imread("photo\\3.jpg",0))
    photos.append(cv2.imread("photo\\4.jpg", 0))
    photos.append(cv2.imread("photo\\5.jpg", 0))
    photos.append(cv2.imread("photo\\6.jpg", 0))
    photos.append(cv2.imread("photo\\7.jpg", 0))
    lables.append(0)
    lables.append(1)
    lables.append(2)
    lables.append(3)
    lables.append(4)
    lables.append(5)
    lables.append(6)
    lables.append(7)
    recognizer=cv2.face.LBPHFaceRecognizer_create()  #创建识别器
    recognizer.train(photos,np.array(lables))  #训练识别器

    gray_image=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    lable,confidence=recognizer.predict(gray_image)  #分析图像
    if confidence<60:
        for (x, y, w, h) in faces:
            cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 255), 5)
            cv2.putText(image,"None",(x,y),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2)
    else:
        for (x, y, w, h) in faces:
            cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 255), 5)
            cv2.putText(image, "Guff_hys", (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

    cv2.imshow("video", image)
    key=cv2.waitKey(1)
    if key==32:
        break
    if key==112:
        cv2.imwrite("photo/%shhh.jpg"%index,image)
        index+=1
capture.release()
cv2.destroyAllWindows()

按空格键退出窗口,按“p”键拍摄当前图像(和照相机一样)存到文件内

haarcascade_frontalface_default.xml文件:

https://pan.baidu.com/s/1QQi40knqggr3KGytn4NtOw?pwd=hhh3

如果本文对您有所帮助,还请点赞收藏一下呀~😍 😘 😚

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
乘风的头像乘风管理团队
上一篇 2023年11月6日
下一篇 2023年11月6日

相关推荐