我正在计算covar并使用cv方法cv__calcCovarMatrix
第一种方法
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),但协方差通常除以样本-1而不是样本。
[11.209877, -7.1728396;
-7.1728396, 5.5802469]
答案 0 :(得分:1)
只需使用不带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
类型是类似矩阵的事物的通用分类器。它可能会也可能不会接受您的向量,但您在代码中的两次试用中都使用第一次调用,这需要Mat
。 std::vector
不是Mat
,这就是为什么它不会编译。尝试第二个电话。