OpenCV——人脸识别

一、LBPH算法

1.1 简介

LBPH(Local Binary Patterns Histogram,局部二值模式直方图)算法使用的模型基于LBP(Local Binary Pattern,局部二值模式)算法。LBP 算法最早是被作为一种有效的纹理描述算法提出的,因在表述图像局部纹理特征方面效果出众而得到广泛应用。

1.2 实现步骤

1、以每个像素为中心,判断与周围像素灰度值大小关系,对其进行二进制编码,从而获得整幅图像的LBP编码图像;

示例:

2、再将LBP图像分为n个区域,获取每个区域的LBP编码直方图,继而得到整幅图像的LBP编码直方图。 通过比较不同人脸图像LBP编码直方图达到人脸识别的目的,其优点是不会受到光照、缩放、旋转和平移的影响。

1.3 重要函数

python 复制代码
cv2.face.LBPHFaceRecognizer_create(
    radius=1,        # 圆形邻域半径
    neighbors=8,     # 采样点数量
    grid_x=8,         # 水平方向分块数
    grid_y=8,         # 垂直方向分块数
    threshold=100.0   # 识别置信度阈值
)

参数介绍

radius:默认为1,表示中心像素周围的圆形半径。

neighbors:默认为8,表示圆形上采样多少个点来计算 LBP 特征。

grid_x:默认为8,表示水平方向上的的单元格数,即将LBP特征图在水平方向上划分为8个单元。

grid_y:默认为8,表示垂直方向上的的单元格数,即将LBP特征图在垂直方向上划分为8个单元。

threshold:默认100,置信度超过这个值无法识别。

1.4 代码实现

1.4.1 创建用于训练的数据集

python 复制代码
import cv2
import numpy as np

# 提前训练的人脸照片
images=[]
images.append(cv2.imread(r'..\data\face_start\hg1.png',cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread(r'..\data\face_start\hg2.png',cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread(r'..\data\face_start\pyy1.png',cv2.IMREAD_GRAYSCALE))
images.append(cv2.imread(r'..\data\face_start\pyy2.png',cv2.IMREAD_GRAYSCALE))

1.4.2 建立数据集对应的标签

python 复制代码
labels=[0,0,1,1]
dic={0:'胡歌',1:'彭于晏',-1:'无法识别'}

1.4.3 创建特征提取器并训练

python 复制代码
recognizer=cv2.face.LBPHFaceRecognizer_create(threshold=80)
recognizer.train(images,np.array(labels))

1.4.4 进行预测

python 复制代码
label,confidence=recognizer.predict(predict_image)
print('这人是:',dic[label])
print('置信度:',confidence)

二、EigenFaces算法

2.1 简介

Eigenfaces是在人脸识别的计算机视觉问题中使用的一组特征向量的名称,Eigenfaces是基于PCA(主成分分析)算法实现的。

2.2 PCA介绍

主成分分析(PCA)是一种矩阵的压缩算法,在减少矩阵维数的同时尽可能的保留原矩阵的信息,简单来说就是将 n×m的矩阵转换成n×k的矩阵,仅保留矩阵中所存在的主要特性,从而可以大大节省空间和数据量。

PCA方法是EigenFaces人脸识别的核心,但是其具有明显的缺点,在操作过程中会损失许多人脸的特征信息。因此在某些特殊的情况下,如果损失的信息刚好是用于分类 的关键信息,必然导致结果预测错误。

2.3 重要函数

python 复制代码
cv2.face.EigenFaceRecognizer_create(
    num_components=None, 
    threshold=None        
复制代码
创建一个EigenFace的人脸特征识别器

参数介绍:

num_components:默认使用80,PCA 降维保留的特征数量

threshold:默认为None,置信度超过指定值 判定无法识别

2.4 代码实现

2.4.1 创建用于训练的数据集

python 复制代码
import cv2
import numpy as np

images=[]  # 读取训练图像,注意:图片大小需要一致
a=cv2.imread(filename=r'..\data\face_start\hg1.png', flags=0)
a=cv2.resize(a, dsize=(120,180))
b=cv2.imread(filename=r'..\data\face_start\hg2.png', flags=0)
b=cv2.resize(b, dsize=(120,180))
c=cv2.imread(filename=r'..\data\face_start\pyy1.png', flags=0)
c=cv2.resize(c, dsize=(120,180))
d=cv2.imread(filename=r'..\data\face_start\pyy2.png', flags=0)
d=cv2.resize(d, dsize=(120,180))

images.append(a)
images.append(b)
images.append(c)
images.append(d)

2.4.2 建立数据集对应的标签

python 复制代码
labels=[0,0,1,1]
dic={0:'hg',1:'pyy',-1:'-1'}

2.4.3 创建特征提取器并训练

python 复制代码
recognizer = cv2.face.EigenFaceRecognizer_create(threshold=5000)
recognizer.train(images, np.array(labels))

2.4.4 进行预测

python 复制代码
pre_image=cv2.imread(filename=r'..\data\face_start\hg.png', flags=0)
pre_image=cv2.resize(pre_image, dsize=(120,180))

label,confidence = recognizer.predict(pre_image)

print('这人是:',dic[label])
print('置信度为:',confidence)

aa=cv2.putText(cv2.imread(r'..\data\face_start\hg.png').copy(),dic[label], (10,30),cv2.FONT_HERSHEY_SIMPLEX,0.9, (0,0,255), 2)
cv2.imshow( 'xx',aa)
cv2.waitKey(0)

运行结果;

三、FisherFaces算法

3.1 简介

Fisherfaces采用LDA(Linear Discriminant Analysis,线性判别分析)实现人脸识别。

3.2 基本原理

在低维表示下,首先将训练集样本集投影到一条直线A上,让投影后的点满足: 同类间的点尽可能地靠近 异类间的点尽可能地远离。

3.3 重要函数

python 复制代码
cv2.face.FisherFaceRecognizer_create(
    num_components=None,
    threshold=None
)
复制代码
创建一个FisherFace的人脸特征识别器

参数介绍:

num_components:默认None即内部自动计算最大值 = 类别数 − 1

进行线性判别分析时保留的成分数量。可以采用默认值"0",让函数自动设置合适的成分数量。

threshold:

进行识别时所用的阈值。如果预测返回的confidence比设定的阈值threshold还要大,函数会返回"-1",小于返回已有标签。

3.4 代码实现

这里自定义了一个函数,使得在图片上能够显示出中文字符。

python 复制代码
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont


def cv2AddChineseText(img, text, position, textColor=(0, 255, 0), textSize=30):
    """向图片中添加中文"""
    if isinstance(img, np.ndarray):  # 判断是否OpenCV图片类型
        img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))#实现array到image的转换
    draw = ImageDraw.Draw(img) #在img图片上创建一个绘图的对象
    # 字体的格式
    fontStyle = ImageFont.truetype( "simsun.ttc", textSize, encoding="utf-8")
    draw.text(position, text, textColor, font=fontStyle) # 绘制文本
    return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)# 转换回OpenCV格式


def image_re(image):
    a=cv2.imread(image, flags=0)
    a=cv2.resize(a, dsize=(120,180))
    images.append(a)

images=[]
image_re(r'..\data\face_start\hg1.png')
image_re(r'..\data\face_start\hg2.png')
image_re(r'..\data\face_start\pyy1.png')
image_re(r'..\data\face_start\pyy2.png')

labels=[0,0,1,1]

pre_image=cv2.imread(filename=r'..\data\face_start\hg.png', flags=0)# 读取待识别图像
pre_image=cv2.resize(pre_image, dsize=(120,180))


recognizer=cv2.face.FisherFaceRecognizer_create(threshold=5000)

recognizer.train(images,np.array(labels))

label,confidence=recognizer.predict(pre_image)

dic={0:'胡歌',1:'彭于晏',-1:'无法识别'}
print('这人是:',dic[label])
print('置信度为:',confidence)

image = cv2AddChineseText(cv2.imread(r'..\data\face_start\hg.png').copy(), dic[label], position=(30,10),textColor=(255,0,0)) 
cv2.imshow('xx',image)
cv2.waitKey(0)
相关推荐
xingyuzhisuan2 小时前
怎么快速在云上部署一个Stable Diffusion环境?(实操落地版)
人工智能·stable diffusion·ai绘画·gpu算力
weixin_408099672 小时前
跨境电商OCR:3秒识别多语言商品标签
开发语言·图像处理·人工智能·后端·ocr·api·文字识别ocr
北京耐用通信2 小时前
赋能智能制造:耐达讯自动化CC-Link IE转EtherCAT网关的行业价值
人工智能·物联网·网络协议·自动化·信息与通信
tongxianchao2 小时前
A Survey of Token Compression for Efficient Multimodal Large Language Models
人工智能·语言模型·自然语言处理
东离与糖宝2 小时前
成本砍半!Java 生产环境 INT4/INT8 模型量化 + 提示词缓存落地
java·人工智能
枫叶林FYL2 小时前
MCP 实现深度技术报告
人工智能·深度学习
yanqiu121382 小时前
ai导出的数学分析
人工智能
SeatuneWrite3 小时前
AI漫剧APP2025推荐,创意无限的个性化剧情体验
人工智能·python