思路簡述
PCA即主成分分析。計算主成分的目的是将高維資料投影到較低維空間。給定 n 個變量的 m 個觀察值,形成一個 n ′ m 的資料矩陣, n 通常比較大。
按自己的了解就是,将一個空間的資料投影到一個子空間裡,實作降維,并且變換到特定的子空間,會使相似的資料聚合在一起,不同類的資料圖像分開的遠些(是以就用到變換空間),在這個子空間裡實作資料的比較分析更容易些。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISM0czMyMTM3ETOwITM1EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
實作步驟
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;