天天看點

基于PCA簡單的人臉識别opencv實作-圖像處理學習筆記

思路簡述

PCA即主成分分析。計算主成分的目的是将高維資料投影到較低維空間。給定 n 個變量的 m 個觀察值,形成一個 n ′ m 的資料矩陣, n 通常比較大。

按自己的了解就是,将一個空間的資料投影到一個子空間裡,實作降維,并且變換到特定的子空間,會使相似的資料聚合在一起,不同類的資料圖像分開的遠些(是以就用到變換空間),在這個子空間裡實作資料的比較分析更容易些。

基于PCA簡單的人臉識别opencv實作-圖像處理學習筆記

實作步驟

1。讀取訓練樣本

将人臉資料庫加載到記憶體中,每幅圖像用一個行向量表示,将所有資料庫中圖像用一個矩陣來表示。

for (int i = ;i <= ;i++)
    {
        data = imread(path +to_string(i)+"\\1.png", CV_LOAD_IMAGE_GRAYSCALE);
        data.reshape(1, 1).row(0).convertTo(row_tmp, CV_32FC1);
        row_copy(row_tmp, database, i *  - );

        data = imread(path + to_string(i) + "\\2.png", CV_LOAD_IMAGE_GRAYSCALE);
        data.reshape(1,1).row(0).convertTo(row_tmp, CV_32FC1);
        row_copy(row_tmp, database, i *  - );
    }
           

注意一定要讀取灰階圖,并且轉換成CV_32FC1

求特征向量(特征臉)

int number_principal_compent = ;//保留最大的主成分數(特征向量數)(為對應特征值(貢獻度)最大前十的特征向量)
                                      //構造pca資料結構
    PCA pca(database, Mat(), CV_PCA_DATA_AS_ROW, number_principal_compent);//Mat為掩碼 對象為整個矩陣不用操作
    Mat eigenvectors = pca.eigenvectors.clone();
           

求出每個訓練樣本和測試樣本在子空間中的投影系數

Mat cv=pca.project(database);

Mat test = pca.project(testimage);
           

計算每個訓練樣本和測試樣本的歐式距離,取其中最小的為識别圖檔

vector< double > distance

for (int i = ;i < cv.rows;i++)
    {
        distance[i]=norm(test,cv.row(i));
    }
auto smallest = min_element(begin(distance), end(distance));
    cout << "min element is " << *smallest << " at position " << std::distance(std::begin(distance), smallest) << std::endl;