Eigen 라이브러리는 웹사이트에 게시된 그대로 선형대수 라이브러리 이다.
http://eigen.tuxfamily.org/index.php?title=Main_Page
eigenvector 연산 때문에 이 라이브러리를 교수님께서 소개해 주셨다.
고유벡터에 대한 이야기는 다음 포스팅에서 하고,
Matlab의 [eval,evec]=eig(M)
과 같은 결과의 고유벡터를 뽑고싶으면 이 라이브러리를 사용하면 된다.
opencv의 eigen이나 타 라이브러리는 결과값이 Matlab과 일치하지 않는다.
여러 컴파일러를 지원하고, 여러가지 언어를 지원한다.
처음에 설치할때 쓸데없이 애를좀 먹었는데,
http://eigen.tuxfamily.org/index.php?title=Visual_Studio
여기 써있는대로 CMake는 테스트를 위한것이지 라이브러리 임포트가 아니다.
먼저 해당 라이브러리를 다운받으면, eigen-eigen-b9cd8366d4e8과 같은 폴더가 있는데,
이 안에 Eigen폴더만 따로 컴파일러에서 추가포함라이브러리에 걸어놓으면 된다.
C++의 기본 라이브러리와 같이 .h, .hpp가 아닌 확장자가 없는 형태이다.
아래는 opencv의 행렬을 Eigen행렬로 변환하고, 고유벡터를 구한후 다시 opencv 벡터로 가져오는 모습이다.
#include<Eigen/Core>
#include<Eigen/Eigenvalues>
Eigen::MatrixXd mtx_evec = Eigen::MatrixXd::Ones(3, 3);
for (int i = 0; i < 3; i++){
for (int j = 0; j < 3; j++){
mtx_evec(i, j) = M2.at<cvFloat>(i, j);
}
}
Eigen::EigenSolver<Eigen::MatrixXd> es(mtx_evec);
auto evec_t = es.eigenvectors();
cv::Mat evec(3, 3, CV_64FC1);
for (int i = 0; i < 3; i++){
for (int j = 0; j < 3; j++){
evec.at<cvFloat>(i, j) = evec_t(i, j).real();
}
}
주로 행렬쪽만 사용해 봤는데, 매우 괜찮다. 단점이라면 컴파일이 좀 느린것...
연구실 컴퓨터 cpu가 i5 ㅠㅠ
주의 사항이라면, 전치행렬을 사용할때 transpose()
메소드가 아닌 adjoint()
메소드를 써야 한다.