2015-02-20 2 views
0

У меня есть cv::Mat вроде этого:Расчет ковариации в OpenCV

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); 

Результатом является непонятная матрица 3x3 ...

new_covs= 
[11220.02, 10838.03, 10987.83; 
    10838.03, 10469.045, 10613.745; 
    10987.83, 10613.745, 10760.445] 

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

+1

Я предполагаю [calcCovarMatrix] (http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#calccovarmatrix) будет полезно. – WhozCraig

+0

Я редактировал вопрос с дополнительной информацией. – Ricardo

+1

Ваши образцы являются ** строками ** ввода, правильно? Итак, почему вы говорите функции, что это столбцы? –

ответ

2

В соответствии с документацией для получения масштабированной ковариации необходим флаг «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); 
4

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

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; 

Я надеюсь, что это будет услужливо кому-то !!!

Приветствия !!

Смежные вопросы