• OpenCV自学笔记二十六:人脸检测


    目录

    一、人脸检测

    二、LBPH人脸识别

    三、EigenFaces人脸识别

    四、Fisherfaces人脸识别


    一、人脸检测

    在OpenCV中,人脸检测是一个常见的计算机视觉任务,可以通过Haar级联分类器来实现。Haar级联分类器是一种基于机器学习的目标检测方法,利用Haar特征和级联分类器进行人脸检测。

    Haar特征是一种基于图像局部区域的特征描述符,它通过计算图像中不同位置和尺度的矩形区域的像素差值和来表示图像的特征。Haar特征包括边缘特征、线性特征和中心特征等。级联分类器是由多个弱分类器组成的级联结构,每个弱分类器根据Haar特征对图像进行二分类判别。

    在OpenCV中,人脸检测的函数为`cv.CascadeClassifier()`。下面是一个使用OpenCV进行人脸检测的示例代码:

    1. import cv2 as cv
    2. # 加载人脸检测器
    3. face_cascade = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
    4. # 读取图像
    5. image = cv.imread('input.jpg')
    6. # 转换为灰度图像
    7. gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    8. # 进行人脸检测
    9. faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
    10. # 在图像上绘制检测到的人脸
    11. for (x, y, w, h) in faces:
    12. cv.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
    13. # 显示结果图像
    14. cv.imshow('Face Detection', image)
    15. cv.waitKey(0)
    16. cv.destroyAllWindows()

    在上述示例中,我们首先加载了一个训练好的人脸检测器,通过`CascadeClassifier()`函数指定了Haar级联分类器的文件路径。然后,读取一张输入图像,并将其转换为灰度图像,因为人脸检测通常在灰度图像上进行。接下来,调用`detectMultiScale()`函数进行人脸检测,其中包括了一些参数设置,如缩放因子、邻近矩形个数和最小检测尺寸等。最后,在原始图像上绘制检测到的人脸位置,并显示结果图像。

    运行以上代码,将展示原始图像,并在检测到的人脸位置绘制矩形框。

    二、LBPH人脸识别

    在OpenCV中,LBPH(Local Binary Patterns Histograms)是一种常用的人脸识别算法。LBPH算法通过提取局部二值模式(Local Binary Patterns)特征,并构建特征直方图进行人脸识别。

    LBPH算法的原理如下:

    1. 将输入图像转换为灰度图像。

    2. 对每个像素点的邻域进行采样,将其与中心像素值进行比较,得到二值编码。如果邻域像素值大于等于中心像素值,则该像素点被标记为1,否则标记为0。

    3. 将二值编码连接起来,得到一个二进制数。这个二进制数被称为局部二值模式。

    4. 根据局部二值模式构建特征直方图,统计不同的模式出现次数。

    5. 使用特征直方图进行人脸识别,比较待识别人脸的特征直方图与已知人脸的特征直方图之间的相似性。

    OpenCV中,LBPH人脸识别的函数为`cv.face.LBPHFaceRecognizer_create()`。下面是一个使用LBPH算法进行人脸识别的示例代码:

    1. import cv2 as cv
    2. import os
    3. # 加载训练数据
    4. data_path = 'data'
    5. face_images = []
    6. face_labels = []
    7. for label_name in os.listdir(data_path):
    8. label_path = os.path.join(data_path, label_name)
    9. for image_name in os.listdir(label_path):
    10. image_path = os.path.join(label_path, image_name)
    11. face_images.append(cv.imread(image_path, 0))
    12. face_labels.append(int(label_name))
    13. # 创建LBPH人脸识别器
    14. recognizer = cv.face.LBPHFaceRecognizer_create()
    15. # 训练识别器
    16. recognizer.train(face_images, np.array(face_labels))
    17. # 进行人脸识别
    18. test_image = cv.imread('test.jpg', 0)
    19. label, confidence = recognizer.predict(test_image)
    20. print("识别结果:", label)
    21. print("置信度:", confidence)

    在上述示例中,我们首先加载训练数据集,并将每个人脸图像和对应的标签存储在`face_images`和`face_labels`列表中。然后,创建一个LBPH人脸识别器。使用`train()`函数对识别器进行训练,其中参数为训练数据集。接下来,加载要进行人脸识别的测试图像,并使用`predict()`函数对测试图像进行识别,得到预测的标签和置信度。最后,输出识别结果和置信度。

    需要注意的是,LBPH算法对于光照变化和遮挡比较敏感,而且适用于小规模数据集的人脸识别任务。对于更复杂的场景和大规模数据集,可能需要使用其他更强大的人脸识别算法

    三、EigenFaces人脸识别

    在OpenCV中,EigenFaces是一种常用的人脸识别算法,基于主成分分析(Principal Component Analysis,PCA)进行特征提取和人脸识别。

    EigenFaces算法的原理如下:

    1. 首先,将输入图像集转换为灰度图像,并将每个图像拉平为一个向量。

    2. 将所有训练图像的数据向量按列堆叠,得到一个数据矩阵。

    3. 对数据矩阵进行均值归一化,即减去所有数据向量的均值。

    4. 对均值归一化后的数据矩阵进行主成分分析(PCA),得到特征向量和对应的特征值。特征向量通常被称为Eigenfaces。

    5. 选择保留最大特征值的前N个特征向量,将它们作为人脸识别的特征。

    6. 对于待识别的人脸,将其数据向量减去均值,并投影到特征空间中。

    7. 使用最近邻分类器或其他方法,将待识别人脸与已知人脸进行比较,找到最相似的人脸。

    在OpenCV中,EigenFaces人脸识别的函数为`cv.face.EigenFaceRecognizer_create()`。下面是一个使用EigenFaces算法进行人脸识别的示例代码:

    1. import cv2 as cv
    2. import os
    3. # 加载训练数据
    4. data_path = 'data'
    5. face_images = []
    6. face_labels = []
    7. for label_name in os.listdir(data_path):
    8. label_path = os.path.join(data_path, label_name)
    9. for image_name in os.listdir(label_path):
    10. image_path = os.path.join(label_path, image_name)
    11. face_images.append(cv.imread(image_path, 0))
    12. face_labels.append(int(label_name))
    13. # 创建EigenFaces人脸识别器
    14. recognizer = cv.face.EigenFaceRecognizer_create()
    15. # 训练识别器
    16. recognizer.train(face_images, np.array(face_labels))
    17. # 进行人脸识别
    18. test_image = cv.imread('test.jpg', 0)
    19. label, confidence = recognizer.predict(test_image)
    20. print("识别结果:", label)
    21. print("置信度:", confidence)

    在上述示例中,我们首先加载训练数据集,并将每个人脸图像和对应的标签存储在`face_images`和`face_labels`列表中。然后,创建一个EigenFaces人脸识别器。使用`train()`函数对识别器进行训练,其中参数为训练数据集。接下来,加载要进行人脸识别的测试图像,并使用`predict()`函数对测试图像进行识别,得到预测的标签和置信度。最后,输出识别结果和置信度。

    需要注意的是,EigenFaces算法对于光照变化较敏感,而且适用于小规模数据集的人脸识别任务。对于更复杂的场景和大规模数据集,可能需要使用其他更强大的人脸识别算法。

    四、Fisherfaces人脸识别

    在OpenCV中,Fisherfaces是一种常用的人脸识别算法,基于线性判别分析(Linear Discriminant Analysis,LDA)进行特征提取和人脸识别。

    Fisherfaces算法的原理如下:

    1. 首先,将输入图像集转换为灰度图像,并将每个图像拉平为一个向量。

    2. 将所有训练图像的数据向量按列堆叠,得到一个数据矩阵。

    3. 对数据矩阵进行均值归一化,即减去所有数据向量的均值。

    4. 计算类内散布矩阵(within-class scatter matrix)和类间散布矩阵(between-class scatter matrix)。

    5. 对类内散布矩阵和类间散布矩阵进行特征值分解,得到特征向量和对应的特征值。

    6. 选择保留最大特征值的前N个特征向量,将它们作为人脸识别的特征。

    7. 对于待识别的人脸,将其数据向量减去均值,并投影到特征空间中。

    8. 使用最近邻分类器或其他方法,将待识别人脸与已知人脸进行比较,找到最相似的人脸。

    在OpenCV中,Fisherfaces人脸识别的函数为`cv.face.FisherFaceRecognizer_create()`。下面是一个使用Fisherfaces算法进行人脸识别的示例代码:

    1. import cv2 as cv
    2. import os
    3. # 加载训练数据
    4. data_path = 'data'
    5. face_images = []
    6. face_labels = []
    7. for label_name in os.listdir(data_path):
    8. label_path = os.path.join(data_path, label_name)
    9. for image_name in os.listdir(label_path):
    10. image_path = os.path.join(label_path, image_name)
    11. face_images.append(cv.imread(image_path, 0))
    12. face_labels.append(int(label_name))
    13. # 创建Fisherfaces人脸识别器
    14. recognizer = cv.face.FisherFaceRecognizer_create()
    15. # 训练识别器
    16. recognizer.train(face_images, np.array(face_labels))
    17. # 进行人脸识别
    18. test_image = cv.imread('test.jpg', 0)
    19. label, confidence = recognizer.predict(test_image)
    20. print("识别结果:", label)
    21. print("置信度:", confidence)

    在上述示例中,我们首先加载训练数据集,并将每个人脸图像和对应的标签存储在`face_images`和`face_labels`列表中。然后,创建一个Fisherfaces人脸识别器。使用`train()`函数对识别器进行训练,其中参数为训练数据集。接下来,加载要进行人脸识别的测试图像,并使用`predict()`函数对测试图像进行识别,得到预测的标签和置信度。最后,输出识别结果和置信度。

    需要注意的是,Fisherfaces算法对于光照变化和遮挡比较敏感,而且适用于小规模数据集的人脸识别任务。对于更复杂的场景和大规模数据集,可能需要使用其他更强大的人脸识别算法。

  • 相关阅读:
    使用定时器消除抖动
    unity的ui跟随鼠标移动
    从理解js双重递归执行顺序到用递归方式实现二叉树中序遍历
    trzsz支持文件拖动到终端进行上传,类似lrzsz
    css--风车案例
    基于深度学习的Deepfake检测综述
    法国生物制药公司【Abivax SA】申请1亿美元纳斯达克IPO上市
    Leetcode 151. 反转字符串中的单词 JS版两种方法(内置API,双指针)有详细讲解 小白放心食用
    【JavaEE】多线程(一)
    redis中高并发问题
  • 原文地址:https://blog.csdn.net/m0_71721954/article/details/133175522