我正在使用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;
但是答案是-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_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 ,但是您在代码的两个试验中都使用了第一次调用,因此需要Mat
。 std::vector
不是Mat
,因此这就是为什么它不会编译。尝试第二个电话。