OpenCV中函数calcCovarMatrix的使用

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矩阵组成的数组,是可以运行成功的。



你可能感兴趣的:(calcCovarMatrix)