43
43
#include " precomp.hpp"
44
44
#include < limits>
45
45
46
+ #ifdef HAVE_EIGEN
47
+ #include < Eigen/Core>
48
+ #include < Eigen/Eigenvalues>
49
+ #include " opencv2/core/eigen.hpp"
50
+ #endif
51
+
46
52
#if defined _M_IX86 && defined _MSC_VER && _MSC_VER < 1700
47
53
#pragma float_control(precise, on)
48
54
#endif
@@ -1396,6 +1402,47 @@ bool cv::eigen( InputArray _src, OutputArray _evals, OutputArray _evects )
1396
1402
v = _evects.getMat ();
1397
1403
}
1398
1404
1405
+ #ifdef HAVE_EIGEN
1406
+ const bool evecNeeded = _evects.needed ();
1407
+ const int esOptions = evecNeeded ? Eigen::ComputeEigenvectors : Eigen::EigenvaluesOnly;
1408
+ _evals.create (n, 1 , type);
1409
+ cv::Mat evals = _evals.getMat ();
1410
+ if ( type == CV_64F )
1411
+ {
1412
+ Eigen::MatrixXd src_eig, zeros_eig;
1413
+ cv::cv2eigen (src, src_eig);
1414
+
1415
+ Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> es;
1416
+ es.compute (src_eig, esOptions);
1417
+ if ( es.info () == Eigen::Success )
1418
+ {
1419
+ cv::eigen2cv (es.eigenvalues ().reverse ().eval (), evals);
1420
+ if ( evecNeeded )
1421
+ {
1422
+ cv::Mat evects = _evects.getMat ();
1423
+ cv::eigen2cv (es.eigenvectors ().rowwise ().reverse ().transpose ().eval (), v);
1424
+ }
1425
+ return true ;
1426
+ }
1427
+ } else { // CV_32F
1428
+ Eigen::MatrixXf src_eig, zeros_eig;
1429
+ cv::cv2eigen (src, src_eig);
1430
+
1431
+ Eigen::SelfAdjointEigenSolver<Eigen::MatrixXf> es;
1432
+ es.compute (src_eig, esOptions);
1433
+ if ( es.info () == Eigen::Success )
1434
+ {
1435
+ cv::eigen2cv (es.eigenvalues ().reverse ().eval (), evals);
1436
+ if ( evecNeeded )
1437
+ {
1438
+ cv::eigen2cv (es.eigenvectors ().rowwise ().reverse ().transpose ().eval (), v);
1439
+ }
1440
+ return true ;
1441
+ }
1442
+ }
1443
+ return false ;
1444
+ #else
1445
+
1399
1446
size_t elemSize = src.elemSize (), astep = alignSize (n*elemSize, 16 );
1400
1447
AutoBuffer<uchar> buf (n*astep + n*5 *elemSize + 32 );
1401
1448
uchar* ptr = alignPtr ((uchar*)buf, 16 );
@@ -1408,6 +1455,7 @@ bool cv::eigen( InputArray _src, OutputArray _evals, OutputArray _evects )
1408
1455
1409
1456
w.copyTo (_evals);
1410
1457
return ok;
1458
+ #endif
1411
1459
}
1412
1460
1413
1461
namespace cv
0 commit comments