使用C++和OpenCV进行人脸识别,包含模型训练与调用过程

引言:

人脸识别是计算机视觉领域的一个重要应用,可以用于安全系统、人脸解锁和人脸表情分析等方面。本教程将向您展示如何使用C++和OpenCV库实现基本的人脸识别功能。我们将分为两部分,首先是模型训练过程,然后是调用过程。

第一部分:模型训练过程

安装OpenCV和C++开发环境:
在开始之前,请确保您已经安装了OpenCV库和C++开发环境。您可以从OpenCV官方网站下载和安装OpenCV,并设置好C++编译环境。

准备数据集:
为了训练人脸识别模型,您需要一个带有标记的人脸数据集。收集足够数量的人脸图像,并为每个人脸标记一个唯一的标签。

数据预处理:
在进行训练之前,需要对数据集进行预处理。使用OpenCV库的人脸检测器来定位和裁剪人脸区域。确保所有图像具有相同的大小和格式。

训练人脸识别模型:
使用预处理后的数据集,我们可以开始训练人脸识别模型。在OpenCV中,可以使用诸如LBPH(Local Binary Patterns Histograms)、Eigenfaces或Fisherfaces等算法来训练模型。选择一个适合您需求的算法,并使用训练数据集进行训练。

保存模型:
训练完成后,将训练得到的模型保存到磁盘上以便后续调用。

第二部分:调用过程

加载人脸识别模型:
在调用人脸识别功能之前,首先加载之前训练好的模型。使用OpenCV提供的API从磁盘上加载模型文件。

初始化摄像头:
在进行人脸识别之前,需要初始化摄像头以获取视频流。使用OpenCV的VideoCapture类来打开和读取摄像头数据。

人脸检测和识别:
在每一帧图像中,使用人脸检测器来检测人脸区域。然后,将检测到的人脸与之前训练好的模型进行比对

特征提取和匹配:
从检测到的人脸区域中提取特征向量。这可以通过将人脸图像转换为灰度图像,并应用直方图均衡化等预处理方法来实现。然后,使用训练好的人脸识别模型来匹配提取到的特征向量与已知的人脸标签进行比对。

显示结果:
根据匹配结果,可以在图像中绘制边界框并显示识别结果。在识别到的人脸区域周围绘制矩形框,并在框内显示相应的人脸标签或身份信息。

实时人脸识别:
将上述步骤放入一个循环中,以实现实时的人脸识别功能。不断从摄像头中读取图像,并进行人脸检测、特征提取和匹配,然后显示识别结果。

代码实现

下面是一个简单的示例代码,演示了人脸识别模型的训练过程和调用过程。训练过程从文件夹中读取图片,每个文件夹代表一个人。

训练过程代码:


#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
#include <filesystem>

using namespace cv;
namespace fs = std::filesystem;

// 函数用于读取文件夹中的图像文件并提取人脸特征向量
void extractFaceFeatures(const std::string& folderPath, std::vector<cv::Mat>& images, std::vector<int>& labels)
{
    for (const auto& personDir : fs::directory_iterator(folderPath))
    {
        if (!fs::is_directory(personDir)) continue;
        int label = std::stoi(personDir.path().filename().string());

        for (const auto& imgPath : fs::directory_iterator(personDir))
        {
            cv::Mat image = cv::imread(imgPath.path().string(), cv::IMREAD_GRAYSCALE);
            if (image.empty()) continue;

            images.push_back(image);
            labels.push_back(label);
        }
    }
}

int main()
{
    std::string dataFolderPath = "path/to/data/folder";
    std::vector<cv::Mat> images;
    std::vector<int> labels;

    extractFaceFeatures(dataFolderPath, images, labels);

    // 创建并训练人脸识别模型(使用LBPH算法)
    Ptr<face::LBPHFaceRecognizer> model = face::LBPHFaceRecognizer::create();
    model->train(images, labels);

    // 保存模型到磁盘
    model->save("path/to/save/model.xml");

    std::cout << "模型训练完成并保存成功!" << std::endl;

    return 0;
}

调用过程代码:


#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;

int main()
{
    
    
    // 加载训练好的人脸识别模型
    Ptr<face::LBPHFaceRecognizer> model = face::LBPHFaceRecognizer::create();
    model->read("path/to/saved/model.xml");

    // 初始化摄像头
    VideoCapture capture(0);
    if (!capture.isOpened())
    {
    
    
        std::cerr << "无法打开摄像头!" << std::endl;
        return -1;
    }

    // 创建人脸检测器
    CascadeClassifier faceCascade;
    faceCascade.load("path/to/haarcascade_frontalface_default.xml");

    while (true)
    {
    
    
        Mat frame;
        capture >> frame;
        if (frame.empty()) break;

        // 转换为灰度图像
        Mat grayFrame;
        cvtColor(frame, grayFrame, COLOR_BGR2GRAY);

        // 人脸检测
        std::vector<Rect> faces;
        faceCascade.detectMultiScale(grayFrame, faces, 1.1, 3, 0, Size(80, 80));

        for (const Rect& face : faces)
        {
    
    
            // 人脸识别
            Mat faceImage = grayFrame(face);
            int label;
            double confidence;
            model->predict(faceImage, label, confidence);

            // 在图像上绘制矩形
			 rectangle(frame, face, Scalar(255, 0, 0), 2);

            // 显示识别结果
            std::string labelText = "Unknown";
            if (confidence < 70.0)  // 设置一个阈值进行识别结果判断
            {
    
    
                labelText = "Person " + std::to_string(label);
            }

            Point labelPosition(face.x, face.y - 10);
            putText(frame, labelText, labelPosition, FONT_HERSHEY_SIMPLEX, 0.9, Scalar(255, 0, 0), 2);
        }

        // 显示视频流
        imshow("Face Recognition", frame);

        // 按下ESC键退出
        if (waitKey(1) == 27) break;
    }

    return 0;
}

请注意,上述代码仅提供了一个基本的示例,用于演示人脸识别的训练和调用过程。实际应用中可能需要进一步优化和处理异常情况,以提高准确性和稳定性。同时,需要下载并提供OpenCV的人脸检测器和训练数据集来进行实际运行。

总结:

本教程介绍了使用C++和OpenCV进行人脸识别的基本步骤。首先,我们讲解了模型训练过程,包括准备数据集、数据预处理、训练人脸识别模型和保存模型。然后,我们介绍了调用过程,包括加载模型、初始化摄像头、人脸检测和识别、特征提取和匹配,以及显示识别结果。通过这个入门指南,您可以开始使用C++和OpenCV构建自己的人脸识别应用程序。

猜你喜欢

转载自blog.csdn.net/qq_46017342/article/details/130660077