Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 如何利用主成分分析进行降维_Opencv_Pca - Fatal编程技术网

Opencv 如何利用主成分分析进行降维

Opencv 如何利用主成分分析进行降维,opencv,pca,Opencv,Pca,输入:从尺寸为75520的图像中提取的LBP特征,因此输入的LBP数据包含1行和75520列 所需输出:对输入应用PCA以减少维数 目前我的代码看起来像 void PCA_DimensionReduction(Mat &src, Mat &dst){ int PCA_DIMENSON_VAL 40 Mat tmp = src.reshape(1,1); //1 rows X 75520 cols Mat projection_result; Ma

输入:从尺寸为75520的图像中提取的LBP特征,因此输入的LBP数据包含1行和75520列

所需输出:对输入应用PCA以减少维数

目前我的代码看起来像

void PCA_DimensionReduction(Mat &src, Mat &dst){

    int PCA_DIMENSON_VAL 40
    Mat tmp = src.reshape(1,1); //1 rows X 75520 cols
    Mat projection_result;
    Mat input_feature_vector;
    Mat norm_tmp;
    normalize(tmp,input_feature_vector,0,1,NORM_MINMAX,CV_32FC1);
    PCA pca(input_feature_vector,Mat(),CV_PCA_DATA_AS_ROW, PCA_DIMENSON_VAL);
    pca.project(input_feature_vector,projection_result);
    dst = projection_result.reshape(1,1);
}
基本上,我使用这个特征来匹配两幅图像之间的相似性,但如果不应用PCA,我就无法得到正确的结果

任何帮助都将不胜感激

问候

Haris…

您必须从大量图像中收集特征向量,从中制作单个pca(离线),然后使用平均值和特征向量进行投影。
//比方说,您已经收集了10个特征向量和30个元素。
//将它们展平为一行(重塑(1,1)),并将_推回到大数据垫中
材料D(10,30,CV_32F);//10行(特征)30个元素
randu(D,0,10);//仅用于此处的模拟

cerr hi dim lbp,冷;)但是你不应该为所有图像训练一个大型pca(离线)吗?不是每张照片一张吗?嗨,@Haris,事实上,我也有同样的想法,atm。从pca到随机投影,再到walsh hadamard,没有忘记小波,最后是一个简单的dft->抛出hf->dft回来,但最后-不使用lbp(u),而是一个更短的四块lbp特性(只有16个箱子,而不是256个(甚至lbpu为59个),然后跳过任何特性压缩),对我来说效果更好。评论?;)我也会很好奇,你是如何解决“内部面不可用”问题的;)(我的主要问题是找到一个很好的替代品…)Hi@berak感谢您的回复,关于您的第一条评论,我正在关注实施情况,但不知道如何使用PCA降低维度。目前我得到的特征向量大小为75520,但不知道如何将其输入PCA。嗨,我对你的第二条评论有一些疑问,在你的四块lbp特征提取中,你是如何修补脸的?你是在考虑整个脸?还是基于某个陆地标记?嗨,@berak谢谢你的回答,我会尽力理解你的答案,但在回答另一个问题之前,假设我必须比较两幅图像,比如加载img1->计算LBP(1X75520)->应用PCA降维,然后对img2执行相同的步骤,最后比较img1和img2的PCA输出的相似性。是的,完全正确。你比较了2张图片的投影(缩短)特征。顺便说一句,intraface呢?我从github的其他地方获得了一个开源项目库。你需要保存pca.mean和pca.eignvectors。然后,后面的投影是:从特征中减去平均值,然后与转置的特征向量相乘。
// let's say, you have collected 10 feature vectors a 30 elements.
// flatten them to a single row (reshape(1,1)) and push_back into a big Data Mat

Mat D(10,30,CV_32F); // 10 rows(features) a 30 elements
randu(D,0,10);       // only for the simulation here
cerr << D.size() << endl;
// [30 x 10]


// now make a pca, that will only retain 6 eigenvectors
// so the later projections are shortened to 6 elements:

PCA p(D,Mat(),CV_PCA_DATA_AS_ROW,6);
cerr << p.eigenvectors.size() << endl;
// [30 x 6]

// now, that the training step is done, we can use it to
// shorten feature vectors:
// either keep the PCA around for projecting:

// a random test vector, 
Mat v(1,30,CV_32F);
randu(v,0,30);

// pca projection:
Mat vp = p.project(v);

cerr << vp.size() << endl;
cerr << vp << endl;
// [6 x 1]
// [-4.7032223, 0.67155731, 15.192059, -8.1542597, -4.5874329, -3.7452228]


// or, maybe, save the pca.mean and pca.eigenvectors only, and do your own projection:

Mat vp2 = (v - mean) * eigenvectors.t();

cerr << vp2.size() << endl;
cerr << vp2 << endl;
//[6 x 1]
//[-4.7032223, 0.67155731, 15.192059, -8.1542597, -4.5874329, -3.7452228]