如何计算OpenCV PCA的平均值

时间:2015-10-12 20:53:17

标签: opencv pca

我正在使用OpenCV来计算表示为2D点的一组像素的PCA。但我不确定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

1 个答案:

答案 0 :(得分: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#wrapper的一个问题。

平均值最终由方法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 );