opencv中PCA降維

PCA--主成分分析,主要用在降維上。

具體原理講解的很多,在這裏就不多說了。

具體可見:http://blog.csdn.net/xiaojidan2011/article/details/11595869


PCA主要計算步驟如下:

1、事先把每個樣本歸一化,把原始數據中每個樣本用一個向量表示,然後把所有樣本組合起來構成一個矩陣。

2、求該矩陣的協防差矩陣

3、求步驟2中得到的協方差矩陣的特徵值和特徵向量。

4、將求出的特徵向量按照特徵值的大小進行組合形成一個映射矩陣,並根據指定的PCA保留的特徵個數取出映射矩陣的前n行或者前n列作爲最終的映射矩陣。

5、用步驟4的映射矩陣對原始數據進行映射,達到數據降維的目的。


PCA的應用:

1、人臉識別

2、其他運算的預處理也叫數據的白化



opencv中PCA類的主要函數有:

C++: PCA::PCA(InputArray data, InputArray mean, int flags, int maxComponents=0)

//參數依次爲:原始數據;原始數據均值,輸入空會自己計算;每行/列代表一個樣本;保留多少特徵值,默認全保留

C++: PCA::PCA(InputArray data, InputArray mean, int flags, double retainedVariance)

//參數依次爲:原始數據;原始數據均值,輸入空會自己計算;每行/列代表一個樣本;保留多少特徵值,百分比,默認全保留


C++: PCA& PCA::computeVar(InputArray data, InputArray mean, int flags, double retainedVariance)

//參數依次爲:原始數據;原始數據均值,輸入空會自己計算;每行/列代表一個樣本;保留多少特徵值,百分比,默認全保留


C++: Mat PCA::project(InputArray vec) const

//原圖像,投影到新的空間

C++: Mat PCA::backProject(InputArray vec) const

//先進行project之後的數據,反映攝到原始圖像


變量值有:

mean--------原始數據的均值
eigenvalues--------協方差矩陣的特徵值
eigenvectors--------特徵向量

函數使用測試:

#pragma once#pragma execution_character_set("utf-8") 
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <stdio.h>
#include <stdlib.h>
 
using namespace cv;
using namespace std; 

#define DIMENTIONS	7
#define SAMPLE_NUM	31 
float Coordinates[DIMENTIONS*SAMPLE_NUM] = {
	101.5, 100.4, 97.0, 98.7, 100.8, 114.2, 104.2
	, 100.8, 93.5, 95.9, 100.7, 106.7, 104.3, 106.4
	, 100.8, 97.4, 98.2, 98.2, 99.5, 103.6, 102.4
	, 99.4, 96.0, 98.2, 97.8, 99.1, 98.3, 104.3
	, 101.8, 97.7, 99.0, 98.1, 98.4, 102.0, 103.7
	, 101.8, 96.8, 96.4, 92.7, 99.6, 101.3, 103.4
	, 101.3, 98.2, 99.4, 103.7, 98.7, 101.4, 105.3
	, 101.9, 100.0, 98.4, 96.9, 102.7, 100.3, 102.3
	, 100.3, 98.9, 97.2, 97.4, 98.1, 102.1, 102.3
	, 99.3, 97.7, 97.6, 101.1, 96.8, 110.1, 100.4
	, 98.7, 98.4, 97.0, 99.6, 95.6, 107.2, 99.8
	, 99.7, 97.7, 98.0, 99.3, 97.3, 104.1, 102.7
	, 97.6, 96.5, 97.6, 102.5, 97.2, 100.6, 99.9
	, 98.0, 98.4, 97.1, 100.5, 101.4, 103.0, 99.9
	, 101.1, 98.6, 98.7, 102.4, 96.9, 108.2, 101.7
	, 100.4, 98.6, 98.0, 100.7, 99.4, 102.4, 103.3
	, 99.3, 96.9, 94.0, 98.1, 99.7, 109.7, 99.2
	, 98.6, 97.4, 96.4, 99.8, 97.4, 102.1, 100.0
	, 98.2, 98.2, 99.4, 99.3, 99.7, 101.5, 99.9
	, 98.5, 96.3, 97.0, 97.7, 98.7, 112.6, 100.4
	, 98.4, 99.2, 98.1, 100.2, 98.0, 98.2, 97.8
	, 99.2, 97.4, 95.7, 98.9, 102.4, 114.8, 102.6
	, 101.3, 97.9, 99.2, 98.8, 105.4, 111.9, 99.9
	, 98.5, 97.8, 94.6, 102.4, 107.0, 115.0, 99.5
	, 98.3, 96.3, 98.5, 106.2, 92.5, 98.6, 101.6
	, 99.3, 101.1, 99.4, 100.1, 103.6, 98.7, 101.3
	, 99.2, 97.3, 96.2, 99.7, 98.2, 112.6, 100.5
	, 100.0, 99.9, 98.2, 98.3, 103.6, 123.2, 102.8
	, 102.2, 99.4, 96.2, 98.6, 102.4, 115.3, 101.2
	, 100.1, 98.7, 97.4, 99.8, 100.6, 112.4, 102.5
	, 104.3, 98.7, 100.2, 116.1, 105.2, 101.6, 102.6
}; 
float Coordinates_test[DIMENTIONS] = {
	104.3, 98.7, 100.2, 116.1, 105.2, 101.6, 102.6
}; 

int main()
{	
    Mat pcaSet(SAMPLE_NUM, DIMENTIONS, CV_32FC1);	//原始數據
    for (int i = 0; i < SAMPLE_NUM;i++)
	{		
	for (int j = 0; j < DIMENTIONS;j++)
	    {			
		    pcaSet.at<float>(i, j) = Coordinates[i*j + j];
	    }
	}	
	PCA pca(pcaSet,Mat(),CV_PCA_DATA_AS_ROW);
	
	cout << pca.mean;//均值
	cout << endl; 
	
	cout << pca.eigenvalues << endl;//特徵值
	cout << endl;
	
	cout << pca.eigenvectors << endl;//特徵向量	
	
	Mat dst = pca.project(pcaSet);//映射新空間
	cout << endl;
	cout << dst;	
	
	Mat src = pca.backProject(dst);//反映射回來
	cout << endl;
	cout << src;
 
}

結果:

[101.5, 100.43227, 99.58065, 100.06452, 99.838699, 100.24837, 99.783859]

[24.541122;
  14.777925;
  8.6030035;
  7.7478752;
  4.9640956;
  3.4982314;
  0]

[0, 0.51984203, 0.23296018, -0.37617847, 0.40756124, -0.40061155, -0.4553985;
  0, -0.70445395, 0.49155188, -0.16719522, 0.26280969, -0.37678754, 0.15208434;
  0, -0.066723101, -0.038854279, -0.425872, 0.5511927, 0.70094371, 0.13242386;
  0, 0.39764708, 0.065581232, -0.22947183, -0.03224976, -0.23389639, 0.85391527;

  0, 0.22684877, 0.83399707, 0.15428388, -0.27935144, 0.38740331, -0.032665201;
  0, 0.1395478, 0.05239287, 0.7567746, 0.6180082, -0.037830293, 0.14733768;
  1, 0, 0, 0, 0, 0, 0]

[-7.3131528, -5.3501873, 11.577508, 0.60781765, 2.6220136, -0.45538509, 0;
  -7.8768339, 1.1766117, -4.1587815, 1.7213521, 2.6745353, -0.5545125, 0;
  4.830832, 6.3897724, 2.1345577, 0.84970546, 0.47657442, -0.3282631, 0;
  -3.4450772, -5.4992504, -1.2498263, -3.3689275, -2.9782302, 1.5516136, 0;
  10.281049, -7.7164068, 0.67565495, 5.676187, 2.5108516, 1.4743179, 0;
  4.2984672, -0.75921839, -2.5882311, -0.25295436, 4.8868942, -1.3065162, 0;
  0.21250246, 0.61282039, 2.5805261, 1.2471696, 1.0015231, 0.98909825, 0;
  -6.5931559, 4.6479883, 2.1551886, 2.1832461, -2.4442921, -2.8696241, 0;
  -6.8244157, 0.42434323, -0.6853919, -3.048038, 1.7272427, 0.63614368, 0;
  2.6583216, 1.596774, 0.73432744, -0.89127231, 1.7983944, 0.043869421, 0;
  0.095922641, -7.1871662, 0.26721755, 2.4715328, -0.39144242, 1.9969523, 0;
  7.1780763, -1.2327303, 2.3370812, 0.11952236, -3.3782988, 1.0221726, 0;
  3.7909391, -4.8472018, -3.902699, 1.3304355, 0.077061251, -1.6088341, 0;
  2.0462558, 0.99781752, -1.7571733, -1.5092815, 1.4675957, 1.1244757, 0;
  -6.6255755, -1.8157345, 2.6063576, -3.5488029, 2.5637681, 0.97726601, 0;
  -5.361299, 0.40121809, -3.4525211, 0.87062407, -0.55830055, 2.7767134, 0;
  7.4224248, 7.5462208, 3.3444295, -2.152308, -1.55211, 4.7031174, 0;
  -2.6555865, -1.2249128, -1.6175778, 0.3482253, -1.8660933, -1.7037547, 0;
  2.6387012, -6.742743, 0.57189912, -4.1314187, -4.5536275, -1.7193881, 0;
  3.6488121, -0.1332843, -1.0593877, -0.31005722, 1.2057302, -1.7476019, 0;
  -0.10034398, 0.81379104, -1.0097508, -1.4380376, 1.8176793, -2.2551713, 0;
  -4.7259798, 1.3738803, -0.06910602, -2.330924, 0.57052439, -1.5393797, 0;
  -7.0539317, 3.4640625, -0.56143302, 10.470398, -2.0381155, 0.97668087, 0;
  4.358706, 6.8107924, 0.76822168, -0.92740154, 1.7716813, -0.58819091, 0;
  -3.2411737, -0.38846514, -3.8849792, -2.7995861, 1.3991531, 4.4114451, 0;
  0.40072519, 1.1867304, 1.8176504, -0.91143012, -3.7974873, -1.1423945, 0;
  5.7739553, -0.76024073, -1.1735778, 1.2575091, -0.38342121, -1.1518155, 0;
  3.0023592, 0.13134341, -0.85866189, 0.3392027, 0.012864275, -2.1181574, 0;
  -2.9541163, 1.3588973, -2.0341418, 0.23292983, -3.0436382, 1.5964537, 0;
  -0.98775464, 0.01095093, -2.2096908, -1.160388, -1.390853, -2.0177698, 0;
  3.1199689, 4.7135777, 0.70306331, -0.94494265, -0.2082427, -1.1734859, 0]
  
[101.5, 100.4, 97, 98.699997, 100.8, 114.2, 104.2;
  101.5, 97, 100.8, 104.2, 93.5, 100.7, 104.3;
  101.5, 98.699997, 104.2, 95.900002, 104.3, 97.400002, 99.5;
  101.5, 100.8, 93.5, 104.3, 98.199997, 102.4, 97.800003;
  101.5, 114.2, 100.7, 97.400002, 102.4, 99.099998, 99;
  101.5, 104.2, 104.3, 99.5, 97.800003, 99, 96.800003;
  101.5, 100.8, 100.8, 99.400002, 101.8, 101.8, 101.3;
  101.5, 93.5, 98.199997, 97.800003, 98.400002, 101.3, 105.3;
  101.5, 95.900002, 99.5, 104.3, 96.800003, 103.7, 100.3;
  101.5, 100.7, 102.4, 99, 101.3, 100, 98.099998;
  101.5, 106.7, 96, 102, 99.400002, 102.3, 101.1;
  101.5, 104.3, 97.800003, 96.800003, 105.3, 98.099998, 97;
  101.5, 106.4, 98.300003, 99.599998, 96.900002, 97.599998, 97.699997;
  101.5, 100.8, 101.8, 101.3, 100.3, 98.699997, 97.599998;
  101.5, 97.400002, 99, 103.7, 98.099998, 107.2, 99.900002;
  101.5, 98.199997, 98.400002, 105.3, 97.699997, 99.300003, 103;
  101.5, 98.199997, 103.7, 98.400002, 110.1, 96.5, 96.900002;
  101.5, 99.5, 96.800003, 100.3, 97, 99.900002, 100.7;
  101.5, 103.6, 92.699997, 98.900002, 99.800003, 101.4, 94;
  101.5, 102.4, 101.3, 98.099998, 99.300003, 98.699997, 97.400002;
  101.5, 99.400002, 101.3, 99.300003, 97.599998, 100.4, 98.199997;
  101.5, 96, 99.400002, 101.1, 97.199997, 102.4, 99.900002;
  101.5, 98.199997, 98.699997, 100.4, 98.400002, 98.099998, 112.6;
  101.5, 97.800003, 105.3, 97, 103, 97.400002, 98;
  101.5, 99.099998, 100, 107.2, 98.699997, 100, 98.900002;
  101.5, 98.300003, 96.900002, 97.699997, 101.7, 99.699997, 99.199997;
  101.5, 104.3, 100.3, 97.300003, 100.7, 97, 97.800003;
  101.5, 101.8, 100.3, 97.599998, 99.300003, 98.400002, 98.300003;
  101.5, 97.699997, 97.199997, 102.5, 99.699997, 98.199997, 101.6;
  101.5, 99, 98.099998, 99.900002, 97.400002, 98.900002, 98.699997;
  101.5, 98.099998, 102.3, 97.099998, 102.1, 97.900002, 98.199997]請按任意鍵繼續


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章