OpenCV第十二章——人脸识别

admin2024-10-03  8

1.人脸跟踪

1.1 级联分类器

OpenCV第十二章——人脸识别,第1张

OpenCV第十二章——人脸识别,第2张

1.2 方法

1.3分析人脸位置

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

操作代码示例:

import cv2

img = cv2.imread(r"C:\Users\cgs\Desktop\pictures (37).jpg")  # 读取人脸图像
# 加载识别人脸的级联分类器
faceCascade = cv2.CascadeClassifier(r"B:\Python_opencv_book\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), (255, 0, 255), 5)  # 在图像中人脸的位置绘制方框
cv2.imshow("img", img)  # 显示最终处理的效果
cv2.waitKey()  
cv2.destroyAllWindows()  

操作效果图像:

OpenCV第十二章——人脸识别,第3张

1.3.2 实现特效、

操作代码示例:

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(r"C:\Users\cgs\Desktop\pictures_37.jpg")  # 读取人脸图像
face_img = cv2.resize(face_img, (800, 800))
glass_img = cv2.imread(r"B:\Python_opencv_book\glass.png", cv2.IMREAD_UNCHANGED)  # 读取眼镜图像,保留图像类型
height, width, channel = glass_img.shape  # 获取眼镜图像高、宽、通道数
# 加载级联分类器
face_cascade = cv2.CascadeClassifier(r"B:\Python_opencv_book\cascades\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()  # 释放所有窗体

操作效果图像:

OpenCV第十二章——人脸识别,第4张

2.检测其他内容

2.1 眼睛跟踪

操作代码示例:

import cv2

img = cv2.imread(r"C:\Users\cgs\Desktop\pictures-3.jpg")  # 读取人脸图像
# img = cv2.resize(img, (800, 800))
# 加载识别眼睛的级联分类器
eyeCascade = cv2.CascadeClassifier(r"B:\Python_opencv_book\cascades\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()  

操作效果图像:

OpenCV第十二章——人脸识别,第5张

2.2 猫脸跟踪

操作代码示例:


import cv2
img = cv2.imread(r"B:\Python_opencv_book\cat.jpg")  # 读取猫脸图像
# 加载识别猫脸的级联分类器
catFaceCascade = cv2.CascadeClassifier(r"B:\Python_opencv_book\cascades\haarcascade_frontalcatface_extended.xml")
catFace = catFaceCascade.detectMultiScale(img, 1.15, 4)  # 识别出所有猫脸
for (x, y, w, h) in catFace:  # 遍历所有猫脸的区域
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 5)# 在图像中猫脸的位置绘制方框
cv2.imshow("A cute cat.", img)  # 显示最终处理的效果
cv2.waitKey()  
cv2.destroyAllWindows()  

操作效果图像:

OpenCV第十二章——人脸识别,第6张

2.3 行人跟踪

在操作用图像:

OpenCV第十二章——人脸识别,第7张

操作代码示例:


import cv2
img = cv2.imread(r"B:\Python_opencv_book\monitoring.jpg")  # 读取图像
# 加载识别类人体的级联分类器
bodyCascade = cv2.CascadeClassifier(r"B:\Python_opencv_book\cascades\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()  


操作效果图像:

OpenCV第十二章——人脸识别,第8张

2.4 车牌跟踪

操作代码示例:


import cv2

img = cv2.imread(r"C:\Users\cgs\Desktop\pictures_10.jpg")  # 读取车的图像
# 加载识别车牌的级联分类器
plateCascade = cv2.CascadeClassifier(r"B:\Python_opencv_book\cascades\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()  


操作效果图像:

OpenCV第十二章——人脸识别,第9张

3.人脸识别

3.1 Eigenfaces人脸识别器

示例代码如下:其中Elvis1、2、3和summers1、2、3为训练样本,summers4为待识别图像。


import cv2
import numpy as np

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

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

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

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

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

操作结果:

OpenCV第十二章——人脸识别,第10张

3.2 Fisherfaces人脸识别器

recognizer = cv2.face.FisherFaceRecognizer_create(num_components=150, threshold=200.0)
# 假设 images 是包含人脸图像列表的变量,每个图像已调整为相同大小  
# labels 是与每个图像对应的标签列表  
recognizer.train(images, labels)
# 假设 new_face 是待识别的人脸图像,且已调整为与训练样本相同的尺寸  
label, confidence = recognizer.predict(new_face)  
  
# 输出识别结果  
print(f"Recognized as person with label: {label}, confidence: {confidence}")  
  
# 根据置信度判断识别是否成功  
if confidence < 5000:  
    print("High confidence in recognition")  
else:  
    print("Low confidence in recognition")

 操作代码示例:


import cv2
import numpy as np

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

photos.append(cv2.imread(r"B:\Python_opencv_book\face\kaikai1.png", 0))  # 记录第4张人脸图像
lables.append(1)  # 第4张图像对应的标签
photos.append(cv2.imread(r"B:\Python_opencv_book\face\kaikai2.png", 0))  # 记录第5张人脸图像
lables.append(1)  # 第5张图像对应的标签
photos.append(cv2.imread(r"B:\Python_opencv_book\face\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(r"B:\Python_opencv_book\face\Mike4.png", 0)  # 待识别的人脸图像
label, confidence = recognizer.predict(i)  # 识别器开始分析人脸图像
print("confidence = " + str(confidence))  # 打印评分
print(names[str(label)])  # 数组字典里标签对应的名字

cv2.waitKey()
cv2.destroyAllWindows()  

操作效果:

 OpenCV第十二章——人脸识别,第11张

3.3 Local Binary Pattern Histogram人脸识别器

import cv2  
  
# 创建LBPH人脸识别器  
recognizer = cv2.face.LBPHFaceRecognizer_create()  
# 如果需要,可以设置参数,如半径和邻居数等,但这里我们使用默认设置  
# recognizer = cv2.face.LBPHFaceRecognizer_create(radius=1, neighbors=8, grid_x=8, grid_y=8)

 

# 假设images是预处理过(灰度化、大小调整等)的图像列表,labels是对应的标签  
images = [...]  # 图像列表  
labels = [...]  # 对应的标签列表  
  
# 训练识别器  
recognizer.train(images, labels)
# 假设test_image是待识别的图像,且已调整为与训练图像相同的大小  
test_image = ...  # 待识别的图像  
  
# 预测  
label, confidence = recognizer.predict(test_image)  
  
# 打印预测结果  
print(f"Predicted label: {label}, Confidence: {confidence}")  
  
# 置信度评分小于某个阈值(例如5000)时,认为识别成功  
if confidence < 5000:  
    print("Recognized with high confidence!")  
else:  
    print("Low confidence recognition or unknown face.")

 操作实例代码:

import cv2
import numpy as np

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

photos.append(cv2.imread(r"B:\Python_opencv_book\face\ruirui1.png", 0))  # 记录第4张人脸图像
lables.append(1)  # 第4张图像对应的标签
photos.append(cv2.imread(r"B:\Python_opencv_book\face\ruirui2.png", 0))  # 记录第5张人脸图像
lables.append(1)  # 第5张图像对应的标签
photos.append(cv2.imread(r"B:\Python_opencv_book\face\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(r"B:\Python_opencv_book\face\ruirui4.png", 0)  # 待识别的人脸图像
label, confidence = recognizer.predict(i)  # 识别器开始分析人脸图像
print("confidence = " + str(confidence))  # 打印评分
print(names[str(label)])  # 数组字典里标签对应的名字

cv2.waitKey() 
cv2.destroyAllWindows()  

操作效果:

OpenCV第十二章——人脸识别,第12张

 4.总结

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