Commit 3e2a57ff authored by edgarriba's avatar edgarriba

Update for non Eigen users

parent 56704b5e
...@@ -12,15 +12,12 @@ ...@@ -12,15 +12,12 @@
# include "opencv2/core/eigen.hpp" # include "opencv2/core/eigen.hpp"
#endif #endif
//#include <Eigen/Eigenvalues>
//#include <Eigen/Core>
using namespace std; using namespace std;
dls::dls(const cv::Mat& opoints, const cv::Mat& ipoints) dls::dls(const cv::Mat& opoints, const cv::Mat& ipoints)
{ {
N = std::max(opoints.checkVector(3, CV_32F), opoints.checkVector(3, CV_64F)); N = std::max(opoints.checkVector(3, CV_32F), opoints.checkVector(3, CV_64F));
p = cv::Mat(3, N, CV_64F); p = cv::Mat(3, N, CV_64F);
z = cv::Mat(3, N, CV_64F); z = cv::Mat(3, N, CV_64F);
...@@ -136,8 +133,6 @@ void dls::run_kernel(const cv::Mat& pp) ...@@ -136,8 +133,6 @@ void dls::run_kernel(const cv::Mat& pp)
int count = 0; int count = 0;
for (int k = 0; k < 27; ++k) for (int k = 0; k < 27; ++k)
{ {
// TODO: solve implementation for complex numbers
// V(:,k) = V(:,k)/V(1,k); // V(:,k) = V(:,k)/V(1,k);
cv::Mat V_kA = eigenvec_r.col(k); // 27x1 cv::Mat V_kA = eigenvec_r.col(k); // 27x1
cv::Mat V_kB = cv::Mat(1, 1, z.depth(), V_kA.at<double>(0)); // 1x1 cv::Mat V_kB = cv::Mat(1, 1, z.depth(), V_kA.at<double>(0)); // 1x1
...@@ -145,9 +140,11 @@ void dls::run_kernel(const cv::Mat& pp) ...@@ -145,9 +140,11 @@ void dls::run_kernel(const cv::Mat& pp)
cv::Mat( V_k.t()).copyTo( eigenvec_r.col(k) ); cv::Mat( V_k.t()).copyTo( eigenvec_r.col(k) );
//if (imag(V(2,k)) == 0) //if (imag(V(2,k)) == 0)
#ifdef HAVE_EIGEN
const double epsilon = 1e-4; const double epsilon = 1e-4;
if( eigenval_i.at<double>(k,0) >= -epsilon && eigenval_i.at<double>(k,0) <= epsilon ) if( eigenval_i.at<double>(k,0) >= -epsilon && eigenval_i.at<double>(k,0) <= epsilon )
{ // it should work without checking imaginari part #endif
{
double stmp[3]; double stmp[3];
stmp[0] = eigenvec_r.at<double>(9, k); stmp[0] = eigenvec_r.at<double>(9, k);
...@@ -282,8 +279,6 @@ void dls::build_coeff_matrix(const cv::Mat& pp, cv::Mat& Mtilde, cv::Mat& D) ...@@ -282,8 +279,6 @@ void dls::build_coeff_matrix(const cv::Mat& pp, cv::Mat& Mtilde, cv::Mat& D)
void dls::compute_eigenvec(const cv::Mat& Mtilde, cv::Mat& eigenval_real, cv::Mat& eigenval_imag, void dls::compute_eigenvec(const cv::Mat& Mtilde, cv::Mat& eigenval_real, cv::Mat& eigenval_imag,
cv::Mat& eigenvec_real, cv::Mat& eigenvec_imag) cv::Mat& eigenvec_real, cv::Mat& eigenvec_imag)
{ {
// EIGENVALUES AND EIGENVECTORS
#ifdef HAVE_EIGEN #ifdef HAVE_EIGEN
Eigen::MatrixXd Mtilde_eig, zeros_eig; Eigen::MatrixXd Mtilde_eig, zeros_eig;
cv::cv2eigen(Mtilde, Mtilde_eig); cv::cv2eigen(Mtilde, Mtilde_eig);
...@@ -305,6 +300,10 @@ void dls::compute_eigenvec(const cv::Mat& Mtilde, cv::Mat& eigenval_real, cv::Ma ...@@ -305,6 +300,10 @@ void dls::compute_eigenvec(const cv::Mat& Mtilde, cv::Mat& eigenval_real, cv::Ma
cv::eigen2cv(eigval_imag, eigenval_imag); cv::eigen2cv(eigval_imag, eigenval_imag);
cv::eigen2cv(eigvec_real, eigenvec_real); cv::eigen2cv(eigvec_real, eigenvec_real);
cv::eigen2cv(eigvec_imag, eigenvec_imag); cv::eigen2cv(eigvec_imag, eigenvec_imag);
#else
EigenvalueDecomposition es(Mtilde);
eigenval_real = es.eigenvalues();
eigenvec_real = es.eigenvectors();
#endif #endif
} }
......
This diff is collapsed.
...@@ -96,21 +96,15 @@ bool cv::solvePnP( InputArray _opoints, InputArray _ipoints, ...@@ -96,21 +96,15 @@ bool cv::solvePnP( InputArray _opoints, InputArray _ipoints,
} }
else if (flags == DLS) else if (flags == DLS)
{ {
bool result = false;
#ifdef HAVE_EIGEN
cv::Mat undistortedPoints; cv::Mat undistortedPoints;
cv::undistortPoints(ipoints, undistortedPoints, cameraMatrix, distCoeffs); cv::undistortPoints(ipoints, undistortedPoints, cameraMatrix, distCoeffs);
dls PnP(opoints, undistortedPoints); dls PnP(opoints, undistortedPoints);
cv::Mat R, rvec = _rvec.getMat(), tvec = _tvec.getMat(); cv::Mat R, rvec = _rvec.getMat(), tvec = _tvec.getMat();
result = PnP.compute_pose(R, tvec); bool result = PnP.compute_pose(R, tvec);
if (result) if (result)
cv::Rodrigues(R, rvec); cv::Rodrigues(R, rvec);
#else
std::cout << "EIGEN library needed for DLS" << std::endl;
#endif
return result; return result;
} }
else else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment