2017-02-14 5 views
0

расчет расстояния Римана для двух матриц ковариации А и В в Matlab является:OpenCV - Как я могу рассчитать расстояние Римана с помощью C++?

C = sqrt(sum(log(eig(A,B)).^2)) 

Что является эквивалентом для OpenCV с C++?

+0

Все необходимые методы существуют в OpenCV см http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html, так что вы пробовали? –

+0

Моей основной задачей является вычисление обобщенных собственных значений из двух ковариационных матриц (eig (A, B)) в OpenCV. –

+0

Хорошо, это может вам помочь: http://www.developerstation.org/2012/04/general-eigen-values-and-eigen-vectors.html –

ответ

2

Теперь я получил те же результаты, что и Matlab. Следит мое решение C++:

double calculateRiemannianDistance(cv::Mat A, cv::Mat B) { 
Eigen::MatrixXf e_A, e_B; 
cv::cv2eigen(A, e_A); 
cv::cv2eigen(B, e_B); 

/* compute generalized eigenvalues */ 
Eigen::GeneralizedEigenSolver<Eigen::MatrixXf> ges; 
ges.compute(e_A, e_B); 
cv::Mat gev; 
cv::eigen2cv(Eigen::MatrixXf(ges.eigenvalues().real()), gev); 

/* riemannian distance */ 
cv::Mat partial_res; 
cv::log(gev, partial_res); 
cv::pow(partial_res, 2, partial_res); 
double distance = sqrt(cv::sum(partial_res)[0]); 
return distance; 
} 
+0

Кстати, что такое римановое расстояние? и его использования? –

+1

@ JeruLuke, я использовал римановое расстояние, чтобы вычислить расстояние между двумя разными ковариационными матрицами, так как они не принадлежат к евклидову пространству. –

+0

Так что это полезно для статистических выводов ... правильно? –

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