calcCovarMatrix 函数是用来求取向量集的协方差矩阵,参考说明文档试了试,虽然运行成功,但仍然发现一些问题。
calcCovarMatrix(const Mat*samples, int nsamples, Mat& covar, Mat& mean, int flags, int ctype=CV_64F)
samples: 输入的向量集,它们可以是若干个同样形式的向量组成,也可以是一个矩阵的若干行组成。
nsamples: 输入的向量的数目。
covar: 输出的协方差矩阵。
mean: 输出的均值矩阵。
flags: 操作标志,分别有:CV_COVAR_SCRAMBLED,CV_COVAR_NORMAL,CV_COVAR_USE_AVG,CV_COVAR_SCALE,CV_COVAR_ROWS,CV_COVAR_COLS.
具体应用可以参考OpenCV手册。
int _tmain(int argc, _TCHAR* argv[]) { /*Mat_<double> samples = (Mat_<double>(3, 3) << 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0);*/ Mat_<float> samples[3]; for (int i = 0; i < 3; i++) { samples[i].create(1, 3); samples[i](0, 0) = i*3 + 1; samples[i](0, 1) = i*3 + 2; samples[i](0, 2) = i*3 + 3; } Mat_<double> covMat; Mat_<double> meanMat; calcCovarMatrix(samples, 3, covMat, meanMat, CV_COVAR_NORM); string fileName = "test.txt"; FileStorage fs(fileName, FileStorage::WRITE); fs << "meanMat" << meanMat; fs << "covMat" << covMat; fs.release(); return 0; }
——————————————————————————————————————————————————————————
这里先介绍flag最后两个变量,
CV_COVAR_ROWS,CV_COVAR_COLS是指当samples 是由一个矩阵时,用来指用单个向量是由其中行向量或者列向量组成。
测试中发现,如果samples 是单独一个3*3的矩阵时,如程序中所注释的部分,calcCovarMatrix(&samples, 3, covMat, meanMat, CV_COVAR_NORM|CV_COVAR_ROWS);运行不成功;而当samples是由3个1*3的矩阵组成时,即 Mat_<float> samples[3];
calcCovarMatrix(samples, 3, covMat, meanMat, CV_COVAR_NORM);能够运行成功。
查看了一个下午,也没查出原因来,欢迎各位讨论。
——————————————————————————————————————————————————————————
20160125补记:
感谢hnsdgxylh、qq_20844031两位指出错误,我读错了第一个输入参数的解释。samples既可以是多个一般矩阵,也可以是多个行(列)向量。CV_COVAR_ROWS和CV_COVAR_COLS是当samples为行向量或或列向量指定的。
因此程序中注释的部分,如果samples是多个3*3矩阵组成的数组,是可以运行成功的。