【问题标题】:How is the OpenCV PCA mean calculated如何计算 OpenCV PCA 均值
【发布时间】:2016-01-10 10:58:09
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: opencv pca


    【解决方案1】:

    在您的代码的 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 );
    

    【讨论】:

    • 是的,原来是 OpenCvSharp,Mean 返回特征值。我已经在 OpenCvSharp 的 Github 页面上发布了这个问题。
    猜你喜欢
    • 2014-05-02
    • 2012-01-23
    • 2022-11-30
    • 1970-01-01
    • 2019-02-07
    • 2012-05-17
    • 2013-03-28
    相关资源
    最近更新 更多