1
0
mirror of https://github.com/opencv/opencv.git synced 2026-07-31 00:03:03 +04:00

Use Eigen::SelfAdjointEigenSolver in cv::eigen

This commit is contained in:
woody.chow
2017-10-09 18:10:16 +09:00
committed by Alexander Alekhin
parent a3ec2ac3c5
commit 611cf8d86f
2 changed files with 52 additions and 4 deletions
+48
View File
@@ -43,6 +43,12 @@
#include "precomp.hpp"
#include <limits>
#ifdef HAVE_EIGEN
#include <Eigen/Core>
#include <Eigen/Eigenvalues>
#include "opencv2/core/eigen.hpp"
#endif
#if defined _M_IX86 && defined _MSC_VER && _MSC_VER < 1700
#pragma float_control(precise, on)
#endif
@@ -1396,6 +1402,47 @@ bool cv::eigen( InputArray _src, OutputArray _evals, OutputArray _evects )
v = _evects.getMat();
}
#ifdef HAVE_EIGEN
const bool evecNeeded = _evects.needed();
const int esOptions = evecNeeded ? Eigen::ComputeEigenvectors : Eigen::EigenvaluesOnly;
_evals.create(n, 1, type);
cv::Mat evals = _evals.getMat();
if ( type == CV_64F )
{
Eigen::MatrixXd src_eig, zeros_eig;
cv::cv2eigen(src, src_eig);
Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> es;
es.compute(src_eig, esOptions);
if ( es.info() == Eigen::Success )
{
cv::eigen2cv(es.eigenvalues().reverse().eval(), evals);
if ( evecNeeded )
{
cv::Mat evects = _evects.getMat();
cv::eigen2cv(es.eigenvectors().rowwise().reverse().transpose().eval(), v);
}
return true;
}
} else { // CV_32F
Eigen::MatrixXf src_eig, zeros_eig;
cv::cv2eigen(src, src_eig);
Eigen::SelfAdjointEigenSolver<Eigen::MatrixXf> es;
es.compute(src_eig, esOptions);
if ( es.info() == Eigen::Success )
{
cv::eigen2cv(es.eigenvalues().reverse().eval(), evals);
if ( evecNeeded )
{
cv::eigen2cv(es.eigenvectors().rowwise().reverse().transpose().eval(), v);
}
return true;
}
}
return false;
#else
size_t elemSize = src.elemSize(), astep = alignSize(n*elemSize, 16);
AutoBuffer<uchar> buf(n*astep + n*5*elemSize + 32);
uchar* ptr = alignPtr((uchar*)buf, 16);
@@ -1408,6 +1455,7 @@ bool cv::eigen( InputArray _src, OutputArray _evals, OutputArray _evects )
w.copyTo(_evals);
return ok;
#endif
}
namespace cv