- 操作系統: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