opencv学習-アルゴリズム-pca
6257 ワード
申明、本文は転載してからhttp://blog.csdn.net/yang_xian 521/articale/detail/7445536
PCA(print component anlysis、主成分分析)は、みんなが一番多く使っている降維手段だと思います.PCAの理解については、大神さんたちはそれぞれの特技があり、応用できる場合も多いと思います.OpenCVのPCAという種類を紹介します.一般的に使われているので、このタイプはOpenCVに対して独立しています.coreに置いています.
PCA類のメンバー関数は、ビルド関数、演算子再負荷()、プロジェクト、バックプロモーションのこれらの関数を含み、メンバー変数eigenvectors、eignvalues、meanも含む.使いやすいです.例えば、ベクトルのセットPCAを計算したいです.PCAのインスタンスを定義し、主成分を得て、プロジェクトの新しいサンプルをテストしてもいいです.また、元のベクトルを再構築するためにBackProjectを呼び出してもいいです.プロジェクトの逆演算です.
実際に使用して、私はバグ、コンストラクション、演算子重負荷()関数の3番目のパラメータは0または1しか使えないことを発見しました.(それぞれCVC PCAUDATA UASTA UROWとCVUPCA DATAAS COLに対応していますが、対応するマクロを呼び出してコンパイルができません.皆さんも同じですか?
次の例をまとめて分析します.
2001年全国各地区の消費状況指数
地区食品X 1服装X 2家庭設備X 3医療保健X 4交通通信X 5娯楽教育X 6居住X 7
北京101.5 100.4 97.0 98.7 100.8 114.2天津100.8 93.5 100.7 106.7.7.106.4河北100.8 97.4 98.2 99.5 103.4山西99.4 98.2山西99.4 96.0 98.8 99.1 98.3内モンゴル自治体101.8 98.1 98.1 98.1 106.7遼寧省101.8.96.8.99.3.4アムール川6.9 102.7 100.3上海100.3 98.9 97.2 97.4 102.1 102.3江蘇99.3 97.7 97.6 101.196.8 110.8浙江98.4 97.0 99.6安徽99.7 97.7 98.09.6 98.0 100.7 99.4湖北99.3 99.3 96.9 94.0 98.1 99.7 109.7 99.2湖南98.6 98.4 99.8 99.8 99.8 98.2広東98.2 99.4 99.4 99.7 101.5広西98.5 96.7 98.7海南98.4 98.2海南98.2 98.2 98.0.2重慶97978.8.2.997.8 94.6 102.4 107.0 115.5雲南98.3 98.5.106..2 92.5 98.6チベット99.3.99.3.99.1.100.1.103.6.106.7.陝西99.2.99.2.99.7.甘粛100.0 99.9.98.9.103.6.102.2.98.2.98.2.98.6.98.6.02.6
これらのベクトルの消費レベルへの貢献をPCAで分析します.コードの実現は以下の通りです.
[cpp] view plin copy
ヽoo.ツ ヽoo.ツ ヽoo.ツ using namespace cv; using namespace std; void メール(int argc char** argv) { コンサート 要点 SAMPLEUM = 31; コンサート 要点 VCTORUM = 7; fstream fp; ストリングス temp char* filename = argv[1]; Mat pcaSet(SAMPLEUM、 VCTORUM CVC 32 F; // データを読み込み、pcaSetを生成します. fp.open(filename) ios::in); for (int i=0; i<SAMPLEUM i++) { getline(fp) temp、 ' '); for (int j=0; j { fp. >> pcaSet.at<float>(i、 j): } } fp.close() // cout << pcaset << endl PCA pca(pcaSet) Mat() 0/*CVCVCVC AUDATA*/; cout << pca.eigenvalues << endl cout << endl cout << pca.eigenvectors << endl ) 前の3次元の結果だけを以下のように示します.
eigenvalues:[43.18,14.60,9.21]、
eigenvectors:[0.013,0.034,-0.100,-0.130,0.277,0.963,-0.020;
0.157,0.038,0.121,0.893,0.395,0.046,0.060;
0.284,0.018,-0.001,-0.404,0.813,-0.288,0.277]
以下のコードを転載します.http://www.cnblogs.com/zcftech/archive/2013/04/13/3017411.html
PCA(print component anlysis、主成分分析)は、みんなが一番多く使っている降維手段だと思います.PCAの理解については、大神さんたちはそれぞれの特技があり、応用できる場合も多いと思います.OpenCVのPCAという種類を紹介します.一般的に使われているので、このタイプはOpenCVに対して独立しています.coreに置いています.
PCA類のメンバー関数は、ビルド関数、演算子再負荷()、プロジェクト、バックプロモーションのこれらの関数を含み、メンバー変数eigenvectors、eignvalues、meanも含む.使いやすいです.例えば、ベクトルのセットPCAを計算したいです.PCAのインスタンスを定義し、主成分を得て、プロジェクトの新しいサンプルをテストしてもいいです.また、元のベクトルを再構築するためにBackProjectを呼び出してもいいです.プロジェクトの逆演算です.
実際に使用して、私はバグ、コンストラクション、演算子重負荷()関数の3番目のパラメータは0または1しか使えないことを発見しました.(それぞれCVC PCAUDATA UASTA UROWとCVUPCA DATAAS COLに対応していますが、対応するマクロを呼び出してコンパイルができません.皆さんも同じですか?
次の例をまとめて分析します.
2001年全国各地区の消費状況指数
地区食品X 1服装X 2家庭設備X 3医療保健X 4交通通信X 5娯楽教育X 6居住X 7
北京101.5 100.4 97.0 98.7 100.8 114.2天津100.8 93.5 100.7 106.7.7.106.4河北100.8 97.4 98.2 99.5 103.4山西99.4 98.2山西99.4 96.0 98.8 99.1 98.3内モンゴル自治体101.8 98.1 98.1 98.1 106.7遼寧省101.8.96.8.99.3.4アムール川6.9 102.7 100.3上海100.3 98.9 97.2 97.4 102.1 102.3江蘇99.3 97.7 97.6 101.196.8 110.8浙江98.4 97.0 99.6安徽99.7 97.7 98.09.6 98.0 100.7 99.4湖北99.3 99.3 96.9 94.0 98.1 99.7 109.7 99.2湖南98.6 98.4 99.8 99.8 99.8 98.2広東98.2 99.4 99.4 99.7 101.5広西98.5 96.7 98.7海南98.4 98.2海南98.2 98.2 98.0.2重慶97978.8.2.997.8 94.6 102.4 107.0 115.5雲南98.3 98.5.106..2 92.5 98.6チベット99.3.99.3.99.1.100.1.103.6.106.7.陝西99.2.99.2.99.7.甘粛100.0 99.9.98.9.103.6.102.2.98.2.98.2.98.6.98.6.02.6
これらのベクトルの消費レベルへの貢献をPCAで分析します.コードの実現は以下の通りです.
[cpp] view plin copy
ヽoo.ツ
eigenvalues:[43.18,14.60,9.21]、
eigenvectors:[0.013,0.034,-0.100,-0.130,0.277,0.963,-0.020;
0.157,0.038,0.121,0.893,0.395,0.046,0.060;
0.284,0.018,-0.001,-0.404,0.813,-0.288,0.277]
以下のコードを転載します.http://www.cnblogs.com/zcftech/archive/2013/04/13/3017411.html
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <fstream>
#include <sstream>
using namespace cv;
using namespace std;
// 0~255
Mat norm_0_255(const Mat& src) {
//
Mat dst;
switch(src.channels()) {
case 1://
cv::normalize(src, dst, 0, 255, NORM_MINMAX, CV_8UC1);
break;
case 3:
cv::normalize(src, dst, 0, 255, NORM_MINMAX, CV_8UC3);
break;
default:
src.copyTo(dst);
break;
}
return dst;
}
// Row Matrix ; opencv PCA
// ,
Mat asRowMatrix(const vector<Mat>& src, int rtype, double alpha = 1, double beta = 0) {
//
size_t n = src.size();
// ,
if(n == 0)
return Mat();
//
size_t d = src[0].total();
//
Mat data(n, d, rtype);
//
for(int i = 0; i < n; i++) {
// ,
if(src[i].empty()) {
string error_message = format("Image number %d was empty, please check your input data.", i);
CV_Error(CV_StsBadArg, error_message);
}
// d,
if(src[i].total() != d) {
string error_message = format("Wrong number of elements in matrix #%d! Expected %d was %d.", i, d, src[i].total());
CV_Error(CV_StsBadArg, error_message);
}
// :
Mat xi = data.row(i);
// :
if(src[i].isContinuous()) {
src[i].reshape(1, 1).convertTo(xi, rtype, alpha, beta);
} else {
src[i].clone().reshape(1, 1).convertTo(xi, rtype, alpha, beta);
}
}
return data;
}
int main(int argc, const char *argv[]) {
//
vector<Mat> db;
// ORL ,
//
db.push_back(imread("s1/1.pgm", IMREAD_GRAYSCALE));
db.push_back(imread("s1/2.pgm", IMREAD_GRAYSCALE));
db.push_back(imread("s1/3.pgm", IMREAD_GRAYSCALE));
db.push_back(imread("s2/1.pgm", IMREAD_GRAYSCALE));
db.push_back(imread("s2/2.pgm", IMREAD_GRAYSCALE));
db.push_back(imread("s2/3.pgm", IMREAD_GRAYSCALE));
db.push_back(imread("s3/1.pgm", IMREAD_GRAYSCALE));
db.push_back(imread("s3/2.pgm", IMREAD_GRAYSCALE));
db.push_back(imread("s3/3.pgm", IMREAD_GRAYSCALE));
db.push_back(imread("s4/1.pgm", IMREAD_GRAYSCALE));
db.push_back(imread("s4/2.pgm", IMREAD_GRAYSCALE));
db.push_back(imread("s4/3.pgm", IMREAD_GRAYSCALE));
// , PCA
Mat data = asRowMatrix(db, CV_32FC1);
// PCA , 10
int num_components = 10;
// PCA
PCA pca(data, Mat(), CV_PCA_DATA_AS_ROW, num_components);
// PCA
Mat mean = pca.mean.clone();
Mat eigenvalues = pca.eigenvalues.clone();
Mat eigenvectors = pca.eigenvectors.clone();
// :
imshow("avg", norm_0_255(mean.reshape(1, db[0].rows)));
//
imshow("pc1", norm_0_255(pca.eigenvectors.row(0)).reshape(1, db[0].rows));
imshow("pc2", norm_0_255(pca.eigenvectors.row(1)).reshape(1, db[0].rows));
imshow("pc3", norm_0_255(pca.eigenvectors.row(2)).reshape(1, db[0].rows));
// Show the images:
waitKey(0);
// Success!
return 0;
}