OpenCV 人脸分析----人脸识别的一个经典类cv::face::EigenFaceRecognizer

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

这是基于 PCA(主成分分析) 的人脸识别算法实现。它通过将人脸图像投影到一个低维的"特征脸"空间中进行识别,是最早也是最基础的人脸识别方法之一。

构造函数与参数

你可以使用以下方式创建 EigenFaceRecognizer:

cpp 复制代码
// 默认构造
Ptr<EigenFaceRecognizer> model = EigenFaceRecognizer::create();

// 或者指定 PCA 成分数和置信度阈值
Ptr<EigenFaceRecognizer> model = EigenFaceRecognizer::create(num_components, threshold);
参数 描述
num_components PCA 保留的主成分数,默认为 0(自动计算)
threshold 预测时的置信度阈值,超过此值认为未知身份

核心函数摘要

方法 描述
void train(InputArrayOfArrays _src, InputArray _labels) 使用图像集和对应标签训练模型
void predict(InputArray src, int &label, double &confidence) const 预测输入图像的标签及置信度
void save(const String& filename) 保存训练好的模型到文件
void load(const String& filename) 从文件加载模型
Mat getEigenValues() 获取特征值
vector getEigenVectors() 获取特征向量(即特征脸)
vector getProjections() 获取训练样本的投影向量
double getThreshold() 获取当前置信度阈值
void setThreshold(double val) 设置置信度阈值

注意事项

  • 图像必须为 单通道灰度图;
  • 所有图像尺寸必须一致(例如统一缩放为 96x96);
  • 标签为整数类型,表示不同身份 ID;
  • 对光照、姿态变化较敏感;
  • 不适用于大规模数据集或复杂场景;

代码示例

cpp 复制代码
#include <opencv2/opencv.hpp>
#include <opencv2/face.hpp>
#include <vector>

using namespace cv;
using namespace cv::face;
using namespace std;

int main() {
    // 准备训练数据:人脸图像和对应的标签
    vector<Mat> images;     // 人脸图像(灰度图)
    vector<int> labels;     // 标签(如 0: 张三, 1: 李四)

    // 示例加载图像并转换为灰度图
    Mat img1 = imread("/media/dingxin/data/study/OpenCV/sources/images/1.pgm", IMREAD_GRAYSCALE);
    Mat img2 = imread("/media/dingxin/data/study/OpenCV/sources/images/2.pgm", IMREAD_GRAYSCALE);

    images.push_back(img1);
    images.push_back(img2);
    labels.push_back(0);  // 同一人使用相同标签
    labels.push_back(0);

    // 创建 EigenFaceRecognizer 实例
    Ptr<EigenFaceRecognizer> model = EigenFaceRecognizer::create();

    // 训练模型
    model->train(images, labels);

    // 预测新图像
    Mat testImage = imread("/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", IMREAD_GRAYSCALE);

    resize(testImage, testImage, Size(img2.cols, img2.rows));
    int predictedLabel;
    double confidence;
    model->predict(testImage, predictedLabel, confidence);

    cout << "Predicted label: " << predictedLabel << ", Confidence: " << confidence << endl;

    return 0;
}

运行结果

cpp 复制代码
Predicted label: 0, Confidence: 1490.02
相关推荐
链上日记1 小时前
WEEX出席迪拜区块链生活2025,担任白金赞助商
人工智能·区块链·生活
灵途科技4 小时前
灵途科技亮相NEPCON ASIA 2025 以光电感知点亮具身智能未来
人工智能·科技·机器人
文火冰糖的硅基工坊5 小时前
[人工智能-大模型-125]:模型层 - RNN的隐藏层是什么网络,全连接?还是卷积?RNN如何实现状态记忆?
人工智能·rnn·lstm
IT90905 小时前
c#+ visionpro汽车行业,机器视觉通用检测程序源码 产品尺寸检测,机械手引导定位等
人工智能·计算机视觉·视觉检测
Small___ming6 小时前
【人工智能数学基础】多元高斯分布
人工智能·机器学习·概率论
渔舟渡简6 小时前
机器学习-回归分析概述
人工智能·机器学习
王哈哈^_^6 小时前
【数据集】【YOLO】目标检测游泳数据集 4481 张,溺水数据集,YOLO河道、海滩游泳识别算法实战训练教程。
人工智能·算法·yolo·目标检测·计算机视觉·分类·视觉检测
桂花饼6 小时前
Sora 2:从视频生成到世界模拟,OpenAI的“终极游戏”
人工智能·aigc·openai·sora 2
wwlsm_zql6 小时前
荣耀YOYO智能体:自动执行与任务规划,开启智能生活新篇章
人工智能·生活
科学计算技术爱好者6 小时前
未来已来:AI 如何在 3 年内重塑工作、教育与生活
人工智能·ai