6_OpenCV函数cv::calcCovarMatrix()

函数原型:

void cv::calcCovarMatrix(
	const cv::Mat* samples,  // C-array of n-by-1 or 1-by-n matrices
	int nsamples,  // num matrices pointed to by 'samples'
	cv::Mat& covar,  // ref of erturn array for covariance
	cv::Mat& mean,  // ref to return array for mean
	int flags,  // special variations
	int ctype = cv::F64  // output matrix type for covar
);
void cv::calcCovarMatrix(
	cv::InputArray samples,  // n-by-m matrix,but see 'flags' below
	cv::Mat& covar,  // ref to return array for covariance
	cv::Mat& mean,  // ref to return array for mean
	int flags,  // special variations
	int ctype = cv::F64  // output matrix type for covar
);

函数介绍

给定一些向量,假设这些向量表示的点是近似高斯分布的,cv::calcCovarMatrix()将计算这些点的均值和协方差矩阵。可以应用到很多方面,OpenCV有很多附加的flag值,在特定情况下会起作用,这些flag可以用标准的布尔或操作组合在一起。如下是cv::calcCovarMatrix()科恩那个用到的flag参数的值:

flags参数的具体flag值意义
cv::COVAR_NORMAL计算均值和协方差
cv::COVAR_SCRAMBLED快速PCA“scrambled"协方差
cv::COVAR_USE_AVERAGE输入均值而不是计算均值
cv::COVAR_SCALE重新缩放输出的协方差矩阵
cv::COVAR_ROWS使用样本的行作为输入向量
cv::COVAR_COLS使用样本的列作为输入向量

cv::calcCovarMatrix()有两个基本的调用方法,第一种是指向cv::Mat对象矩阵的指针和表示矩阵中的矩阵数量的nsamples一起传入函数,这种情况下,矩阵可以是n x 1或1 x n。第二种是传入一个n x m的矩阵,这种情况下,应该提供flag为cv::COVAR_ROWS以指示存在长度为m的n(行)个向量,或者应该提供flag为cv::COVAR_COLS以指示存在长度为n的m(列)个向量。

cv::calcCovarMatrix()函数的输入输出矩阵都应该是相同的浮点型。结果矩阵的尺寸应该是n x n或m x m,取决于计算的是标准协方差还是scrambled协方差,应该注意的是,使用cv::Mat*形式时,samples的向量输入不一定要是一维的,它们也可以是二维对象。

在所有情况下,结果将放在covar中,但avg的确切含义取决于flag的值。

标志cv::COVAR_NORMAL和cv::COVAR_SCRAMBLED是相互排斥的,只能使用其中一种,不能两者同时使用。

1. 如果使用cv::COVAR_NORMAL,函数只能计算均值和协方差。

标准的协方差由长度为n的m个向量计算得到,被定义为平均值向量的第n个元素,由此产生的协方差矩阵是一个n x n的矩阵。因子z是一个可选比例因子,如果没有使用cv::COVAR_SCALE标志,该因子值为1。

2. 如果使用cv::COVAR_SCRAMBLED标志,cv::calcCovarMatrix()将按照如下计算:

 该标志计算后得到的协方差矩阵是m x m的矩阵,这个矩阵是用在一些特定算法中,比如对非常大的向量进行快速PCA(比如人脸识别技术中)。

3. 如果输入向量的平均值是已知的,使用cv::COVAR_USE_AVG标志,这种情况下,参数avg用来作为输入而不是输出,以减少计算时间。

4. 如果使用标志cv::COVAR_SCALE用于对计算得到的协方差矩阵进行统一缩放,这是上面提到的因子z。和标志cv::COVAR_NORMAL一起使用时,应用的缩放比例是1.0/m(或等效于1.0/nsamples);如果使用cv::COVAR_SCRAMBLED,那么z的值将是1.0/n(向量长度的倒数)。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值