我正在使用cv方法cv__calcCovarMatrix计算covar和均值

第一种方法

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;
  • 我期望从x个样本和y个样本中得到-8.07的协方差以及x = 4.89和y = 5.44的平均值。

  • 但是答案是-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),但协方差通常除以samples-1而不是samples。
    [11.209877, -7.1728396;
     -7.1728396, 5.5802469]
    
  • 我无法编译第二种方法。当然,cv::Mat *与std::vector *不兼容,但是我还应该如何将指针传递给包含两个矩阵的数组。
  • 最佳答案

    只需使用不带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类型是类似于矩阵的事物的通用分类器。它可能会接受也可能不会接受您的 vector ,但是您在代码的两个试验中都使用了第一次调用,因此需要Matstd::vector不是Mat,因此这就是为什么它不会编译。尝试第二个电话。

    10-02 07:54
    查看更多