Рассчитать ковариацию в OpenCV

у меня есть 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]

Я надеюсь, что вы можете помочь мне с моей проблемой!

0

Решение

Согласно документации, вам необходим флаг «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);
2

Другие решения

Я нашел правильный способ сделать это:

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;

Я надеюсь, что это будет полезно для кого-то !!!

Привет!!

4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector