gpt4 book ai didi

opencv - OpenCV PCA的平均值如何计算

转载 作者:行者123 更新时间:2023-12-02 16:38:38 26 4
gpt4 key购买 nike

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

最佳答案

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

关于opencv - OpenCV PCA的平均值如何计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33090016/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com