OpenCV 人脸分析----人脸识别的一个经典类cv::face::EigenFaceRecognizer
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
这是基于 PCA(主成分分析) 的人脸识别算法实现。它通过将人脸图像投影到一个低维的“特征脸”空间中进行识别,是最早也是最基础的人脸识别方法之一。
构造函数与参数
你可以使用以下方式创建 EigenFaceRecognizer:
// 默认构造
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;
- 对光照、姿态变化较敏感;
- 不适用于大规模数据集或复杂场景;
代码示例
#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;
}
运行结果
Predicted label: 0, Confidence: 1490.02