我还没有找到一个使用适合我的情况的Opencv实施PCA分析的实例,所以我不确定我的实现有什么问题,其中包括:
void PreProcessor::performPca()
{
const int type = CV_64F;
cv::Mat pt_mat = cv::Mat::zeros(numPatients, numFeatures, type);
for (int y = 0; y < numPatients; y++)
{
for (int x = 0; x < numFeatures; x++)
{
pt_mat.at<double>(y,x) = features[y].at(x);
}
}
cv::PCA pt_pca(pt_mat, cv::Mat(), CV_PCA_DATA_AS_ROW, numFeatures);
cv::Mat dataprojected(pt_mat.rows, numFeatures, pt_mat.type());
for (int i = 0; i < pt_mat.rows; i++)
{
dataprojected.row(i) = pt_pca.project(pt_mat.row(i));
}
features.clear();
for (int i =0; i< dataprojected.rows; i++)
{
std::vector<double> pcaFeat = dataprojected.row(i);
features.insert(std::pair<int, std::vector<double> >(i, pcaFeat));
}
}
此成员函数尝试查找features
的主要组件,该组件已填充并声明为std::map<int,std::vector<double>> features
。最后,它用主要组件重新填充它。 NumPatients
是features
中的向量数量,numFeatures
是向量中元素的数量。
上面的代码调试并运行,但生成的features
主要用零填充。
我对Opencv的PCA如何工作的理解有什么问题吗?