у меня есть cv::Mat
как это:
500.0 350.2
500.5 355.8
498.7 352.0
............
И мне нужно рассчитать ковариацию. Результат будет примерно таким:
0.8633 1.2167
1.2167 8.1733
Конечно, функция мне нужна calcCovarMatrix…. НО, если я выполню этот код:
cv::Mat a = (cv::Mat_<double>(3, 2) << 500.0, 350.2, 500.5, 355.8, 498.7, 352.0);
cv::Mat mu, new_covs;
cv::calcCovarMatrix(a, new_covs, mu, CV_COVAR_NORMAL | CV_COVAR_COLS);
В результате получается непонятная матрица 3х3 …
new_covs=
[11220.02, 10838.03, 10987.83;
10838.03, 10469.045, 10613.745;
10987.83, 10613.745, 10760.445]
Я надеюсь, что вы можете помочь мне с моей проблемой!
Согласно документации, вам необходим флаг «CV_COVAR_SCALE», чтобы получить масштабированную ковариацию.
Среднее значение на самом деле предоставляется уже в масштабе, поэтому нет необходимости масштабировать его дальше.
Тогда правильное решение:
cv::Mat a = (cv::Mat_<double>(3, 2) << 500.0, 350.2, 500.5, 355.8, 498.7, 352.0);
cv::Mat mean, covs;
cv::calcCovarMatrix(a, covs, mean, CV_COVAR_NORMAL | CV_COVAR_ROWS | CV_COVAR_SCALE);
Я нашел правильный способ сделать это:
cv::Mat a = (cv::Mat_<double>(3, 2) << 500.0, 350.2, 500.5, 355.8, 498.7, 352.0);
cv::Mat mean, covs;
cv::calcCovarMatrix(a, covs, mean, CV_COVAR_NORMAL | CV_COVAR_ROWS);
mean=mean/a.rows;
Я надеюсь, что это будет полезно для кого-то !!!
Привет!!