2015-10-12 26 views
1

我使用OpenCV来计算用2D点表示的一组像素的PCA。但我不确定PCA如何计算这些点的平均值,因为这不是我所期望的。OpenCV PCA的意思是如何计算的

如果我有以下3点(x,y)

(2,1), (2,2), (2,3) 

然后我计算PCA(OpenCvSharp被使用,但它只是一个包装):

Mat input = new Mat(3,2, MatType.CV_32FC1); 
input.Set(0,0, 2f); 
input.Set(0,1, 1f); 
input.Set(1,0, 2f); 
input.Set(1,1, 2f); 
input.Set(2,0, 2f); 
input.Set(2,1, 3f); 

Mat mean = new Mat(); 
PCA pcaResult = new PCA(input, mean, PCA.Flags.DataAsRow); 

float meanX = pcaResult.Mean.Get<float>(0,0); 
float meanY = pcaResult.Mean.Get<float>(0,1); 

meanXmeanY(0.6666667, 0)。在那里我会预期他们是(2,2)(我猜正在发生某种形式的规范化)。 PCA是如何计算的,我需要做些什么来计算我期望的平均值?或者我需要将平均值传递给PCA

回答

0

使用这种移植在你的代码的C++:

#include <opencv2/opencv.hpp> 
#include <iostream> 
using namespace std; 
using namespace cv; 

int main() 
{ 
    Mat1f input = (Mat1f(3,2) << 2, 1, 2, 2, 2, 3); 

    PCA pca(input, Mat(), CV_PCA_DATA_AS_ROW); 

    float meanX = pca.mean.at<float>(0, 0); 
    float meanY = pca.mean.at<float>(0, 1); 

    std::cout << meanX << " - " << meanY << std::endl; 

    return 0; 
} 

我得到的平均值为(2,2),符合市场预期。可能是C#包装的一个问题。


平均最终由方法calcCovarMatrix作为还原运算来计算:

... 
bool takeRows = (flags & CV_COVAR_ROWS) != 0; 
ctype = std::max(CV_MAT_DEPTH(ctype >= 0 ? ctype : type), CV_32F); 
... 
reduce(_src, _mean, takeRows ? 0 : 1, CV_REDUCE_AVG, ctype); 
+1

是的,事实证明这是OpenCvSharp,平均返回特征值。我已经在OpenCvSharp的Github页面上发布了这个问题。 – Ayb4btu