cv :: calcCovarMatrix如何工作?

时间:2017-08-29 20:46:47

标签: opencv

我正在计算covar并使用cv方法cv__calcCovarMatrix

第一种方法

cv::Mat_<uchar> samples(2,9);  samples << 1,3,2,5,8,7,12,2,4,8,6,9,4,3,3,2,7,7;
cv::Mat_<float> covar, mean;
std::cout << "\nsamples\n" << samples;
cv::calcCovarMatrix( samples, covar, mean, cv::COVAR_NORMAL|cv::COVAR_COLS|cv::COVAR_SCALE, CV_32FC1);
std::cout << "\nMean\n" << mean << "\nCovar\n" << covar << std::endl;

第二种方法

cv::Mat_<uchar> x_sample(1,9);  x_sample << 1,3,2,5,8,7,12,2,4;
cv::Mat_<uchar> y_sample(1,9);  y_sample << 8,6,9,4,3,3,2,7,7;
std::vector<cv::Mat> matPtr;
matPtr.push_back(x_sample);
matPtr.push_back(y_sample);
cv::calcCovarMatrix( &matPtr, 9, covar, mean, cv::COVAR_NORMAL, CV_32FC1);
std::cout << "\nMean\n" << mean << "\nCovar\n" << covar << std::endl;
  1. 我期望得到x样本和y样本的-8.07和x = 4.89以及y = 5.44的协方差。
  2. 但答案是-7.17,它除以样本数而不是样本-1。为什么呢?

    样品

    [  1,   3,   2,   5,   8,   7,  12,   2,   4;
       8,   6,   9,   4,   3,   3,   2,   7,   7]
    

    平均数

    [4.8888888;
     5.4444447]
    

    Covar(我使用的是CV_COVAR_SCALE),但协方差通常除以样本-1而不是样本。

    [11.209877, -7.1728396;
     -7.1728396, 5.5802469]
    
    1. 我无法编译第二种方法。当然cv :: Mat *与std :: vector *不兼容,但我应该如何将指针传递给包含两个矩阵的数组。

1 个答案:

答案 0 :(得分:1)

只需使用不带CV_COVAR_NORMAL标记的CV_COVAR_SCALE并自行缩放:

Mat covar, mean;
cv::calcCovarMatrix(samples, covar, mean, cv::CV_COVAR_NORMAL | CV_COVAR_COLS);
covar = covar / (samples.cols - 1);

对于第二点,请注意calcCovarMatrix()两个有效呼叫。来自docs

void calcCovarMatrix(const Mat* samples, int nsamples, Mat& covar, Mat& mean, int flags, int ctype=CV_64F)
void calcCovarMatrix(InputArray samples, OutputArray covar, InputOutputArray mean, int flags, int ctype=CV_64F)

在OpenCV中,InputArray类型是类似矩阵的事物的通用分类器。它可能会也可能不会接受您的向量,但您在代码中的两次试用中都使用第一次调用,这需要Matstd::vector不是Mat,这就是为什么它不会编译。尝试第二个电话。