OpenCV基础知识(10)— 人脸识别(人脸跟踪、眼睛跟踪、行人跟踪、车牌跟踪和人脸识别)

news2024/10/5 22:23:05

前言:Hello大家好,我是小哥谈。人脸识别是基于人的脸部特征信息进行身份识别的一种生物识别技术,也是计算机视觉重点发展的技术。机械学习算法诞生之后,计算机可以通过摄像头等输入设备自动分析图像中包含的内容信息,随着技术的不断发展,现在已经有了多种人脸识别的算法。🌈

 前期回顾:

            史上最全OpenCV常用方法及使用说明汇总,建议收藏!

            OpenCV基础知识(1)— OpenCV概述

            OpenCV基础知识(2)— 图像处理的基本操作(读取图像、显示图像、保存图像和获取图像属性)

            OpenCV基础知识(3)— 图像数字化基础(像素、色彩空间)

            OpenCV基础知识(4)— 绘制图形(线段、矩形、圆形、多边形和文字)

            OpenCV基础知识(5)— 几何变换(缩放、翻转、旋转和透视)

            OpenCV基础知识(6)— 滤波器(均值滤波器、中值滤波器、高斯滤波器和双边滤波器)

            OpenCV基础知识(7)— 腐蚀与膨胀

            OpenCV基础知识(8)— 图形检测(图像轮廓、轮廓拟合、Canny边缘检测和霍夫变换)

            OpenCV基础知识(9)— 视频处理(读取并显示摄像头视频、播放视频文件、保存视频文件等)

            目录

🚀1.人脸跟踪

💥💥1.1 级联分类器

💥💥1.2 方法

💥💥1.3 分析人脸位置

🚀2.检测其他内容

💥💥2.1 眼睛跟踪

💥💥2.2 行人跟踪

💥💥2.3 车牌跟踪

🚀3.人脸识别

💥💥3.1 Eigenfaces人脸识别器

💥💥3.2 Fisherfaces人脸识别器

💥💥3.3 Local Binary Pattern Histogram人脸识别器

说明:关于本节完整代码及相关资源,请在我的“资源”中下载。 ♨️♨️♨️

🚀1.人脸跟踪

人脸跟踪是让计算机在一幅画面中找出人脸的位置。毕竟计算机还达不到人类的智能水平,所以计算机在检测人脸的过程中实际上是在做“分类”操作,例如,计算机发现图像中有一些像素组成了眼睛的特征,那这些像素就有可能是“眼睛”;如果“眼睛”旁边还有“鼻子”和“另一只眼睛”的特征,那这三个元素所在的区域就很有可能是人脸区域;但如果“眼睛”旁边缺少必要的“鼻子”和“另一只眼睛”,那就认为这些像素并没有组成人脸,它们不是人脸图像的一部分。🌵

检测人脸的算法比较复杂,但OpenCV已经将这些算法封装好了,本节将介绍如何利用OpenCV自带的功能进行人脸跟踪。🌵

💥💥1.1 级联分类器

将一系列简单的分类器按照一定顺序级联到一起就构成了级联分类器,使用级联分类器的程序可以通过一系列简单的判断来对样本进行识别。例如,依次满足“有六条腿”“有翅膀”“有头胸腹”这三个条件的样本就可以被初步判断为昆虫,但如果任何一个条件不满足,则不会认为是昆虫。

OpenCV提供了一些已经训练好的级联分类器,这些级联分类器以XML文件的方式保存在以下路径中:

...\Python\Lib\site-packages\cv2\data\

路径说明:

...\Python\:python虚拟机的本地目录。

\Lib\site-packages\:pip安装扩展包的默认目录。

\cv2\data\:OpenCV库的data文件夹。

说明:♨️♨️♨️

不同版本的OpenCV自带的级联分类器XML文件可能会有差别,data文件夹中缺少的XML文件可以到OpenCV的源码托管平台下载。

地址为:https://github.com/opencv/opencv/tree/master/data/haarcascades

每一个XML文件都对应一种级联分类器,但有些级联分类器的功能是类似的(正面人脸识别分类器就有三个),下表就是部分XML文件对应的功能。

想要实现哪种图像检测,就要在程序启动时加载对应的级联分类器。🌱

💥💥1.2 方法

OpenCV实现人脸跟踪需要做两步操作加载级联分类器使用分类器识别图像这两步操作都有对应的方法🌱

首先是加载级联分类器,OpenCV通过CascadeClassifier()方法创建了分类器对象,其语法如下:

<CascadeClassifier object> = cv2.CascadeClassifier(filename)

参数说明:

filename:级联分类器的XML文件名

返回值说明:

object:分类器对象

然后使用已经创建好的分类器对图像进行识别,这个过程需要调用分类器对象的detectMultiScale()方法,其语法如下:

objects = cascade.detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize)

对象说明:

cascade:已有的分类器对象。

参数说明:

image:待分析的图像。

scaleFactor:可选参数,扫描图像时的缩放比例。

minNeighbors:可选参数,每个候选区域至少保留多少个检测结果才可以判定为人脸。该值越大,分析的误差越小。

flags:可选参数,旧版本OpenCV的参数,建议使用默认值。

minSize:可选参数,最小的目标尺寸。

maxSize:可选参数,最大的目标尺寸。

返回值说明:

objects:捕捉到的目标区域数组,数组中每一个元素都是一个目标区域,每一个目标区域都包含四个值,分别是:左上角点横坐标、左上角点纵坐标、区域宽、区域高。

object的格式为:[[244  203  111  111]  [432  81  133  133]]

💥💥1.3 分析人脸位置

haarcascade_frontalface_default.xml是检测正面人脸的级联分类器文件,加载该文件就可以创建出追踪正面人脸的分类器,调用分类器对象的detectMultiScale()方法,得到的objects结果就是分析得出的人脸区域的坐标和宽高。下面通过一个实例来介绍如何实现此功能。🌱

案例1:

在图像的人脸位置绘制红框

haarcascade_frontalface_default.xml文件放到项目根目录下的cascades文件夹中,加载此级联分类器之后,检测出所有可能是人脸的区域,通过for循环在这些区域上绘制红色边框。具体代码如下:

import cv2

img = cv2.imread("model.png")  # 读取人脸图像
# 加载识别人脸的级联分类器
faceCascade = cv2.CascadeClassifier("cascades\\haarcascade_frontalface_default.xml")
faces = faceCascade.detectMultiScale(img, 1.3)  # 识别出所有人脸
for (x, y, w, h) in faces:  # 遍历所有人脸的区域
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 5)  # 在图像中人脸的位置绘制方框
cv2.imshow("img", img)  # 显示最终处理的效果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

运行效果如图所示:

案例2:

戴墨镜特效

手机拍照软件自带各种各样的贴图特效,实际上这些贴图特效就是先定位了人脸位置,然后在人脸相应位置覆盖素材实现的。OpenCV也可以实现此类功能,例如为人脸添加戴墨镜的特效,需要实现以下三个步骤

首先要编写一个覆盖图片的overlay_img()方法。因为素材中可能包含透明像素,这些透明像素不可以遮挡人脸,所以在覆盖背景图像时要做判断,忽略所有透明像素。判断一个像素是否为透明像素,只需将图像从3通道转为4通道,判断第4通道的alpha值,alpha值为1表示完全不透明,alpha值为表示完全透明。

然后要创建人脸识别级联分类器,分析出图像中人脸的区域。

最后要把墨镜图像按照人脸宽度进行缩放,并覆盖到人脸区域约三分之一的位置。

实现以上需求的具体代码如下:

import cv2

# 覆盖图像
def overlay_img(img, img_over, img_over_x, img_over_y):
    """
    覆盖图像
    :param img: 背景图像
    :param img_over: 覆盖的图像
    :param img_over_x: 覆盖图像在背景图像上的横坐标
    :param img_over_y: 覆盖图像在背景图像上的纵坐标
    :return: 两张图像合并之后的图像
    """
    img_h, img_w, img_p = img.shape  # 背景图像宽、高、通道数
    img_over_h, img_over_w, img_over_c = img_over.shape  # 覆盖图像高、宽、通道数
    if img_over_c == 3:  # 通道数小于等于3
        img_over = cv2.cvtColor(img_over, cv2.COLOR_BGR2BGRA)  # 转换成4通道图像
    for w in range(0, img_over_w):  # 遍历列
        for h in range(0, img_over_h):  # 遍历行
            if img_over[h, w, 3] != 0:  # 如果不是全透明的像素
                for c in range(0, 3):  # 遍历三个通道
                    x = img_over_x + w  # 覆盖像素的横坐标
                    y = img_over_y + h  # 覆盖像素的纵坐标
                    if x >= img_w or y >= img_h:  # 如果坐标超出最大宽高
                        break  # 不做操作
                    img[y, x, c] = img_over[h, w, c]  # 覆盖像素
    return img  # 完成覆盖的图像

face_img = cv2.imread("peoples.png")  # 读取人脸图像
glass_img = cv2.imread("glass.png", cv2.IMREAD_UNCHANGED)  # 读取眼镜图像,保留图像类型
height, width, channel = glass_img.shape  # 获取眼镜图像高、宽、通道数
# 加载级联分类器
face_cascade = cv2.CascadeClassifier("./cascades2/haarcascade_frontalface_default.xml")
garyframe = cv2.cvtColor(face_img, cv2.COLOR_BGR2GRAY)  # 转为黑白图像
faces = face_cascade.detectMultiScale(garyframe, 1.3, 5)  # 识别人脸
for (x, y, w, h) in faces:  # 遍历所有人脸的区域
    gw = w  # 眼镜缩放之后的宽度
    gh = int(height * w / width)  # 眼镜缩放之后的高度度
    glass_img = cv2.resize(glass_img, (gw, gh))  # 按照人脸大小缩放眼镜
    overlay_img(face_img, glass_img, x, y + int(h * 1 / 3))  # 将眼镜绘制到人脸上
cv2.imshow("screen", face_img)  # 显示最终处理的效果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

运行效果如图所示:


🚀2.检测其他内容

OpenCV提供的级联分类器除了可以识别人脸以外,还有可以识别一些其他具有明显特征的物体,例如眼睛、行人等。本小节将介绍几个OpenCV自带的级联分类器的用法。🌿

💥💥2.1 眼睛跟踪

haarcascade_eye.xml是检测眼睛的级联分类器文件,加载该文件就可以追踪眼睛的分类器,下面通过一个实例来介绍如何实现此功能。🌱

案例3:

在图像的眼睛位置绘制红框

haarcascade_eye.xml文件放到项目根目录下的cascades3文件夹中,加载此级联分类器之后,检测出所有可能是眼睛的区域,通过for循环在这些区域上绘制红色边框。具体代码如下:

import cv2

img = cv2.imread("peoples.png")  # 读取人脸图像
# 加载识别眼睛的级联分类器
eyeCascade = cv2.CascadeClassifier("cascades3\\haarcascade_eye.xml")
eyes = eyeCascade.detectMultiScale(img, 1.15)  # 识别出所有眼睛
for (x, y, w, h) in eyes:  # 遍历所有眼睛的区域
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 4)  # 在图像中眼睛的位置绘制方框
cv2.imshow("img", img)  # 显示最终处理的效果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

运行效果如图所示:

💥💥2.2 行人跟踪

haarcascade_fullbody.xml是检测人体(正面直立全身或背影直立全身)的级联分类器文件,加载该文件就可以追踪人体的分类器,下面通过一个实例来介绍如何实现此功能。🍄

案例4:

在图像里行人的位置

haarcascade_fullbody.xml文件放到项目根目录下的cascades4文件夹中,加载此级联分类器之后,检测出所有可能是人形的区域,通过for循环在这些区域上绘制红色边框。具体代码如下:

import cv2
img = cv2.imread("monitoring.jpg")  # 读取图像
# 加载识别类人体的级联分类器
bodyCascade = cv2.CascadeClassifier("cascades4\\haarcascade_fullbody.xml")
bodys = bodyCascade.detectMultiScale(img, 1.15, 4)  # 识别出所有人体
for (x, y, w, h) in bodys:  # 遍历所有人体区域
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 5)# 在图像中人体的位置绘制方框
cv2.imshow("img", img)  # 显示最终处理的效果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

运行效果如图所示:

💥💥2.3 车牌跟踪

haarcascade_russian_plate_number.xml是检测汽车车牌的级联分类器文件,虽然文件名直译过来是“俄罗斯车牌”,但同样可以用于检测中国的车牌,只不过精准度稍微低了一点。加载该文件就可以追踪图片中的车牌,下面通过一个实例来介绍如何实现此功能。🌳

案例5:

标记图像中车牌的位置

haarcascade_russian_plate_number.xml文件放到项目根目录下的cascades5文件夹中,加载此级联分类器之后,检测出所有可能是车牌的区域,通过for循环在这些区域上绘制红色边框。具体代码如下:

import cv2

img = cv2.imread("car.jpg")  # 读取车的图像
# 加载识别车牌的级联分类器
plateCascade = cv2.CascadeClassifier("cascades5\\haarcascade_russian_plate_number.xml")
plates = plateCascade.detectMultiScale(img, 1.15, 4)  # 识别出所有车牌
for (x, y, w, h) in plates:  # 遍历所有车牌区域
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 5)  # 在图像中车牌的位置绘制方框
cv2.imshow("img", img)  # 显示最终处理的效果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

运行效果如下所示:


🚀3.人脸识别

OpenCV提供了三种人脸识别方法,分别是EigenfacesFisherfacesLBPH。这三种方法都是通过对比样本的特征最终实现人脸识别。因为这三种算法提取特征的方式不一样,侧重点不同,所以不能分出孰优孰劣,只能说每种方法都有各自的识别风格。🌱

OpenCV为每一种人脸识别方法都提供了创建识别器、训练识别器和识别这三个方法,这三个方法的语法非常相似。本小节将简单介绍如何使用这些方法。🌱

💥💥3.1 Eigenfaces人脸识别器

Eigenfaces也被叫作“特征脸”。 Eigenfaces通过PCA(主成分分析技术)方法将人脸数据转换到另外一个空间维度去做相似性计算。在计算过程中,算法可以忽略掉一些无关紧要的数据,仅识别一些具有代表性的“特征”数据,最后根据这些“特征”来识别人脸。🌱

开发者需要通过三个方法来完成人脸识别操作。

🍀(1)通过cv2.face.EigenFaceRecognizer_create()方法创建Eigenfaces人脸识别器,其语法如下:

recognizer = cv2.face.EigenFaceRecognizer_create(num_components, threshold)

参数说明:

num_components:可选参数,PCA方法中保留的分量个数,建议使用默认值

thresh:可选参数,人脸识别时使用的阈值,建议使用默认值。

返回值说明:

recognizer:创建完的Eigenfaces人脸识别器对象。

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

recognizer.train(src, labels)

对象说明:

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

参数说明:

src:用来训练的人脸图像样本列表,格式为list。样本图像必须宽高一致。

labels:样本对应的标签,格式为数组,元素类型为整数。数组长度必须与样本列表长度相同。样本与标签按照插入顺序一一对应。

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

label, confidence = recognizer.predict(src)

对象说明:

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

参数说明:

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

返回值说明:

label:与样本匹配程度最高的标签值。

confidence:匹配程度最高的信用度评分。评分小于5000就可以认为匹配程度较高,0分表示两幅图像完全一样。

案例6:

使用Eigenfaces识别人脸

现以两个人的照片作为训练样本,第一个人的照片如图8至图10所示,第二个人的照片如图11至图13所示。

用于识别的照片如图14所示。

创建Eigenfaces人脸识别器对象,训练以上样本之后,判断图13所示是哪一个人,具体代码如下:

import cv2
import numpy as np

photos = list()  # 样本图像列表
lables = list()  # 标签列表
photos.append(cv2.imread("face\\summer1.png", 0))  # 记录第1张人脸图像
lables.append(0)  # 第1张图像对应的标签
photos.append(cv2.imread("face\\summer2.png", 0))  # 记录第2张人脸图像
lables.append(0)  # 第2张图像对应的标签
photos.append(cv2.imread("face\\summer3.png", 0))  # 记录第3张人脸图像
lables.append(0)  # 第3张图像对应的标签

photos.append(cv2.imread("face\\Elvis1.png", 0))  # 记录第4张人脸图像
lables.append(1)  # 第4张图像对应的标签
photos.append(cv2.imread("face\\Elvis2.png", 0))  # 记录第5张人脸图像
lables.append(1)  # 第5张图像对应的标签
photos.append(cv2.imread("face\\Elvis3.png", 0))  # 记录第6张人脸图像
lables.append(1)  # 第6张图像对应的标签

names = {"0": "Summer", "1": "Elvis"}  # 标签对应的名称字典

recognizer = cv2.face.EigenFaceRecognizer_create()  # 创建特征脸识别器
recognizer.train(photos, np.array(lables))  # 识别器开始训练

i = cv2.imread("face\\summer4.png", 0)  # 待识别的人脸图像
label, confidence = recognizer.predict(i)  # 识别器开始分析人脸图像
print("confidence = " + str(confidence))  # 打印评分
print(names[str(label)])  # 数组字典里标签对应的名字
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

运行效果如图所示:

程序对比样本特征分析得出,被识别的人物特征最接近的是“Summer”。🍂

💥💥3.2 Fisherfaces人脸识别器

Fisherfaces是由Ronald Fisher最早提出的,这也是Fisherfaces名字的由来。Fisherfaces通过LDA(线性判别分析技术)方法也会将人脸数据转换到另外一个空间维度去做投影计算,最后根据不同人脸数据的投影距离来判断其相似度。🍃

开发者需要通过三个方法来完成人脸识别操作。

🍀 (1)通过cv2.face.FisherFaceRecognizer_create()方法创建Fisherfaces人脸识别器,其语法如下:

recognizer = cv2.face.FisherFaceRecognizer_create(num_components, threshold)

参数说明:

num_components:可选参数,通过Fisherface方法进行判断分析时保留的分量个数,建议使用默认值。

thresh:可选参数,人脸识别时使用的阈值,建议使用默认值。

返回值说明:

recognizer:创建完的Fisherfaces人脸识别器对象。

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

recognizer.train(src, labels)

对象说明:

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

参数说明:

src:用来训练的人脸图像样本列表,格式为list。样本图像必须宽高一致。

labels:样本对应的标签,格式为数组,元素类型为整数。数组长度必须与样本列表长度相同。样本与标签按照插入顺序一一对应。

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

label, confidence = recognizer.predict(src)

对象说明:

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

参数说明:

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

返回值说明:

label:与样本匹配程度最高的标签值。

confidence:匹配程度最高的信用度评分。评分小于5000就可以认为匹配程度较高,0分表示两幅图像完全一样。

下面通过一个实例来演示Fisherfaces人脸识别器的用法。

案例7:

使用Fisherfaces识别人脸

现以两个人的照片作为训练样本,第一个人的照片如图15至图17所示,第二个人的照片如图18至图20所示。

用于识别的照片如图21所示。

创建Fisherfaces人脸识别器对象,训练以上样本之后,判断图20是哪一个人,具体代码如下:

import cv2
import numpy as np

photos = list()  # 样本图像列表
lables = list()  # 标签列表
photos.append(cv2.imread("face1\\Mike1.png", 0))  # 记录第1张人脸图像
lables.append(0)  # 第1张图像对应的标签
photos.append(cv2.imread("face1\\Mike2.png", 0))  # 记录第2张人脸图像
lables.append(0)  # 第2张图像对应的标签
photos.append(cv2.imread("face1\\Mike3.png", 0))  # 记录第3张人脸图像
lables.append(0)  # 第3张图像对应的标签

photos.append(cv2.imread("face1\\kaikai1.png", 0))  # 记录第4张人脸图像
lables.append(1)  # 第4张图像对应的标签
photos.append(cv2.imread("face1\\kaikai2.png", 0))  # 记录第5张人脸图像
lables.append(1)  # 第5张图像对应的标签
photos.append(cv2.imread("face1\\kaikai3.png", 0))  # 记录第6张人脸图像
lables.append(1)  # 第6张图像对应的标签

names = {"0": "Mike", "1": "kaikai"}  # 标签对应的名称字典

recognizer = cv2.face.FisherFaceRecognizer_create()  # 创建线性判别分析识别器
recognizer.train(photos, np.array(lables))  # 识别器开始训练

i = cv2.imread("face1\\Mike4.png", 0)  # 待识别的人脸图像
label, confidence = recognizer.predict(i)  # 识别器开始分析人脸图像
print("confidence = " + str(confidence))  # 打印评分
print(names[str(label)])  # 数组字典里标签对应的名字

cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

运行效果如图所示:

💥💥3.3 Local Binary Pattern Histogram人脸识别器

Local Binary Pattern Histogram简称LBPH,翻译过来就是局部二值模式直方图,这是一种基于局部二值模式算法,善于捕获局部纹理特征。🌵

开发者需要通过三个方法来完成人脸识别操作。

🌵(1)通过cv2.face. LBPHFaceRecognizer_create()方法创建LBPH人脸识别器,其语法如下:

recognizer = cv2.face.LBPHFaceRecognizer_create(radius, neighbors, 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()方法来识别人脸了,该方法会对比样本的特征,给出最相近的结果和评分,其语法如下:

label, confidence = recognizer.predict(src)

对象说明:

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

参数说明:

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

返回值说明:

label:与样本匹配程度最高的标签值。

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

下面通过一个实例来演示LBPH人脸识别器的用法。

案例8:

使用LBPH识别人脸

现以两个人的照片作为训练样本,第一个人的照片如图22至图24所示,第二个人的照片如图25至图27所示。

用于识别的照片如图28所示。

创建LBPH人脸识别器对象,训练以上样本之后,判断图27是哪一个人,具体代码如下:

import cv2
import numpy as np

photos = list()  # 样本图像列表
lables = list()  # 标签列表
photos.append(cv2.imread("face3\\lxe1.png", 0))  # 记录第1张人脸图像
lables.append(0)  # 第1张图像对应的标签
photos.append(cv2.imread("face3\\lxe2.png", 0))  # 记录第2张人脸图像
lables.append(0)  # 第2张图像对应的标签
photos.append(cv2.imread("face3\\lxe3.png", 0))  # 记录第3张人脸图像
lables.append(0)  # 第3张图像对应的标签

photos.append(cv2.imread("face3\\ruirui1.png", 0))  # 记录第4张人脸图像
lables.append(1)  # 第4张图像对应的标签
photos.append(cv2.imread("face3\\ruirui2.png", 0))  # 记录第5张人脸图像
lables.append(1)  # 第5张图像对应的标签
photos.append(cv2.imread("face3\\ruirui3.png", 0))  # 记录第6张人脸图像
lables.append(1)  # 第6张图像对应的标签

names = {"0": "LXE", "1": "RuiRui"}  # 标签对应的名称字典

recognizer = cv2.face.LBPHFaceRecognizer_create()  # 创建LBPH识别器
recognizer.train(photos, np.array(lables))  # 识别器开始训练

i = cv2.imread("face3\\ruirui4.png", 0)  # 待识别的人脸图像
label, confidence = recognizer.predict(i)  # 识别器开始分析人脸图像
print("confidence = " + str(confidence))  # 打印评分
print(names[str(label)])  # 数组字典里标签对应的名字

cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

运行效果如图所示:

程序对比样本特征分析得出,被识别的人物特征最接近的是“RuiRui”。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/974482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud从基础到活用(超详细)

一、认识微服务 项目的架构方式有&#xff1a;单体架构、分布式架构、微服务架构- 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;项目架构也从单体架构逐渐演变为现在流行的微服务架构。 - 这些架构之间有怎样的差别呢&#xff1f;1、单体架构 **单体…

Linux设备驱动程序

一、设备驱动程序简介 图1.1 内核功能的划分 可装载模块 Linux有一个很好的特性:内核提供的特性可在运行时进行扩展。这意味着当系统启动 并运行时&#xff0c;我们可以向内核添加功能( 当然也可以移除功能)。 可在运行时添加到内核中的代码被称为“模块”。Linux内核支持好几…

Si24R2F+畜牧 耳标测体温开发资料

Si24R2F是针对IOT应用领域推出的新款超低功耗2.4G内置NVM单发射芯片。广泛应用于2.4G有源活体动物耳标&#xff0c;带实时测温计步功能。相较于Si24R2E&#xff0c;Si24R2F增加了温度监控、自动唤醒间隔功能&#xff1b;发射功率由7dBm增加到12dBm&#xff0c;距离更远&#xf…

聊透 GPU 通信技术——GPU Direct、NVLink、RDMA

最近人工智能大火&#xff0c;AI 应用所涉及的技术能力包括语音、图像、视频、NLP 等多方面&#xff0c;而这些都需要强大的计算资源支持。AI 技术对算力的需求是非常庞大的&#xff0c;虽然 GPU 的计算能力在持续提升&#xff0c;但是对于 AI 来说&#xff0c;单卡的计算能力就…

大模型 Dalle2 学习三部曲(二)clip学习

clip论文比较长48页&#xff0c;但是clip模型本身又比较简单&#xff0c;效果又奇好&#xff0c;正所谓大道至简&#xff0c;我们来学习一下clip论文中的一些技巧&#xff0c;可以让我们快速加深对clip模型的理解&#xff0c;以及大模型对推荐带来革命性的变化。 clip结构 首选…

智慧公厕是对智慧城市“神经末梢”的有效激活,公共厕所实现可感知、可视化、可管理、可控制

在当今科技迅速发展的时代&#xff0c;智慧城市已经成为人们关注的热点话题。作为城市基础设施的重要组成部分&#xff0c;公共厕所也逐渐融入到智慧城市的建设中&#xff0c;成为城市管理的焦点之一。智慧公厕作为智慧城市的“神经末梢”&#xff0c;通过可感知、可视化、可管…

期权开户平台:怎样0门槛开户期权,不懂别乱来!

“期权开户平台有传统券商平台、在线期权分仓开户平台、期权科普馆等。具体可用的期权开户平台会因各地区的监管规定和券商政策而有所不同&#xff0c;下文为大家介绍期权开户平台&#xff1a;怎样0门槛开通期权&#xff0c;不懂别乱来&#xff01;本文来自&#xff1a;期权酱 …

无涯教程-JavaScript - MINUTE函数

描述 MINUTE函数返回时间值的分钟。分钟以整数形式给出,范围为0到59。 语法 MINUTE (serial_number)争论 Argument描述Required/OptionalSerial_number 您想要找到的包含分钟的时间。 可以输入时间 作为引号内的文本字符串(如" 6:45 PM") 为十进制数字(如0.7812…

简易实现QT中的virtualkeyboard及问题总结

文章目录 前言&#xff1a;一、虚拟键盘的实现综合代码 二、为什么选用QWidget而不适用QDialog实现键盘三、从窗体a拉起窗体b后&#xff0c;窗体b闪退问题的探讨四、关闭主窗口时子窗口未关闭的问题 前言&#xff1a; 本文章主要包含四部分&#xff1a; 虚拟键盘的实现&#…

【LeetCode-中等题】207. 课程表

文章目录 题目方法一&#xff1a;bfs广度优先 有向图的拓扑排序&#xff08;入度&#xff09;方法二&#xff1a;dfs 深度优先搜索 题目 此题就可以转换为&#xff0c;求一个有向图是否存在环&#xff1b; 存在环&#xff0c;拓扑排序得出的结果是不完整的&#xff0c; 如果不…

Vue+NodeJS上传图片到腾讯云Cos

一.前端Vue 1.选择图片 --HTML <input type"file" accept"image/*" change"handleFileChange"> <el-button size"large" click"changeAvatar">上传头像</el-button> //选择图片 function handleFileC…

⽹络与HTTP 笔试题精讲1

OSI七层与TCP/IP 这个就是OSI参考模型,⽽实际我们现在的互联⽹世界是就是这个理论模型的落地叫做TCP/IP协议 TCP的三次握⼿与四次挥⼿ 客户端想要发送数据给服务端,在发送实际的数据之前,需要先在两端之间建⽴连接,数据发完以后也需要将该连接关闭。建⽴连接的过程就是我们…

Visual Studio 新建类从默认internal改为public

前言 之前一直用的Resharp辅助编写C#代码&#xff0c;Resharp用起来的确方便不少&#xff0c;但是太消耗开发机内存了。重装电脑后&#xff0c;还是决定使用Visual Studio内置的功能。 默认情况下&#xff0c;Visual Studio 中生成一个类或接口是internal类型的&#xff0c;而…

让你忘了自己还戴着耳机,南卡OE Pro 00压开放式耳机

开放式耳机的好处很多&#xff0c;不入耳不会产生异物感&#xff0c;在户外运动可以时刻保持与外界连接更安全&#xff0c;也不会因为耳塞的卫生问题造成耳道感染&#xff0c;因此对于需要长时间佩戴耳机的户外运动&#xff0c;尤其对于一些患有耳道疾病的用户&#xff0c;需要…

LM-Infinite: 一种简单有效的大模型即时长度泛化,解决更长文本推理问题

深度学习自然语言处理 原创作者&#xff1a;qazw 论文&#xff1a;LM-Infinite: Simple On-the-Fly Length Generalization for Large Language Models地址&#xff1a;https://arxiv.org/abs/2308.16137 进NLP群—>加入NLP交流群 摘要 近年来&#xff0c;LLM在各个领域的性…

问道管理:A股休息时间表?

在股票买卖中&#xff0c;歇息时刻能够给股民们喘息的时机&#xff0c;也是一种标准和保证买卖的方法。那么&#xff0c;A股的歇息时刻是什么时分&#xff1f;为什么要有这样的歇息时刻&#xff1f;歇息时刻对股民和商场又有哪些影响呢&#xff1f;本文将从多个角度剖析A股的歇…

Day 41 动态规划part03 : 343. 整数拆分 96.不同的二叉搜索树

96. 不同的二叉搜索树 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#xff1a;n 1…

【耗时50天报告】南卡/韶音/cleer等开放式耳机最详测评,2023开放式耳机机皇花落谁家

随着移动互联网的发展,蓝牙耳机已成为大众生活中不可或缺的移动设备。在蓝牙耳机这一种类中,开放式蓝牙耳机以其超强的舒适、安全、便携等优势而备受关注。相比传统蓝牙耳机,开放式耳机只需一个小巧的主体直接挂在耳朵上,不会给耳部带来任何压迫感,具有出色的通风性和舒适性&am…

【AIGC专题】Stable Diffusion 从入门到企业级实战0402

一、概述 本章是《Stable Diffusion 从入门到企业级实战》系列的第四部分能力进阶篇《Stable Diffusion ControlNet v1.1 图像精准控制》第02节&#xff0c; 利用Stable Diffusion ControlNet Openpose模型精准控制图像生成。本部分内容&#xff0c;位于整个Stable Diffusion生…

文件系统与inode编号

文件描述符fd 0&1&2 Linux 进程默认情况会有3个缺省打开的文件描述符&#xff0c;分别是标准输入0&#xff0c; 标准输出1&#xff0c; 标准错误2. 0,1,2对应的物理设备一般是&#xff1a;键盘&#xff0c;显示器&#xff0c;显示器 所以输入输出还可以采用如下方式 …