使用calcCovarMatrix时出现问题

时间:2014-02-20 11:28:52

标签: matlab opencv covariance

我正在尝试将一些Matlab代码移植到OpenCV,其中一部分涉及获取协方差矩阵

Octave示例:

octave:1> A=[-1, 1, 2; -2, 3, 1; 4, 0, 3;]
A =

  -1   1   2
  -2   3   1
   4   0   3

octave:2> cov(A)
ans =

   10.3333   -4.1667    3.0000
   -4.1667    2.3333   -1.5000
    3.0000   -1.5000    1.0000

OpenCV版本:

Mat_<double> A(3,3);  A << -1, 1, 2, -2, 3, 1 , 4, 0, 3;
Mat Sw, mea;
calcCovarMatrix( A, Sw, mea, cv::COVAR_NORMAL|cv::COVAR_ROWS );
cerr << Sw << endl;

[20.66666666666666, -8.333333333333334, 6;
 -8.333333333333334, 4.666666666666667, -3;
 6, -3, 2]

正如您所看到的,类似,但在OpenCV版本中是因素2。 这里有任何明显的错误吗?


切换ROWS / COLS标志与转置输入相同:

calcCovarMatrix( A, Sw, mea, cv::COVAR_NORMAL|cv::COVAR_COLS );
[4.666666666666666, 5.666666666666666, -2.666666666666667;
 5.666666666666666, 12.66666666666667, -9.666666666666666;
 -2.666666666666667, -9.666666666666666, 8.666666666666666]

calcCovarMatrix( A.t(), Sw, mea, cv::COVAR_NORMAL|cv::COVAR_COLS );
[20.66666666666666, -8.333333333333334, 6;
 -8.333333333333334, 4.666666666666667, -3;
 6, -3, 2]

1 个答案:

答案 0 :(得分:5)

在openCv calcCovMatrix的定义中,有一个未明确被视为“scale”的变量。 Matlab评估E [(x-mu)(x-mu)']因此它必须除以nSmaples-1 = 3-1 = 2(可以证明除以nSamples-1而不是nSamples这个估计量没有偏差 - 当nSamples增长时,这没有任何真正的区别)。另一方面,openCv以不同的方式对待它,它取决于标志。

更新: Matlab也会根据样本数量进行扩展,但它不是默认值。这不是默认值,因为正如我之前所说的那样,它不是无偏见的。因此,如果您希望以与matlab相同的方式进行缩放,则可以使用更改@AldurDisciple提供的缩放比例CV_COVAR_SCALE并乘以(nSamples)/(nSample-1)或仅除以(nSamples-1)的选项。但是,除了nSamples之外也很常见,因为这不是一个非常严重的问题,因为通常nSamples很大,1 / nSamples和1 /(nSamples-1)之间的差异非常小。