OpenCV PCA 均值是如何计算的
How is the OpenCV PCA mean calculated
我正在使用 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);
meanX
和 meanY
分别是 (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 计算一组表示为 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);
meanX
和 meanY
分别是 (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 );