14 #include <Eigen/Dense> 16 #include <Eigen/StdVector> 19 #include <mrpt/config.h> 20 #if MRPT_HAS_OPENCV && MRPT_OPENCV_VERSION_NUM<0x240 21 # undef MRPT_HAS_OPENCV 22 # define MRPT_HAS_OPENCV 0 29 lhm::lhm(Eigen::MatrixXd obj_pts_, Eigen::MatrixXd img_pts_, Eigen::MatrixXd cam_,
int n0) : F(n0)
38 Q = Eigen::MatrixXd::Ones(3,
n);
49 for (
int i = 0; i <
n; i++)
50 sum_ +=
F[i] *
R*
P.col(i);
56 for (
int i = 0; i <
n; i++)
57 Q.col(i) =
R*
P.col(i) +
t;
62 Eigen::Matrix4d Q_(4, 4);
64 Q_ <<
q(0), -
q(1), -
q(2), -
q(3),
65 q(1),
q(0), -
q(3),
q(2),
66 q(2),
q(3),
q(0), -
q(1),
67 q(3), -
q(2),
q(1),
q(0);
74 Eigen::Matrix4d Q_(4, 4);
76 Q_ <<
q(0), -
q(1), -
q(2), -
q(3),
77 q(1),
q(0),
q(3), -
q(2),
78 q(2), -
q(3),
q(0),
q(1),
79 q(3),
q(2), -
q(1),
q(0);
86 for (
int i = 0; i <
n; i++)
87 Q.col(i) =
F[i] *
Q.col(i);
89 Eigen::Vector3d P_bar, Q_bar;
90 P_bar =
P.rowwise().mean();
91 Q_bar =
Q.rowwise().mean();
93 for (
int i = 0; i <
n; i++)
95 P.col(i) =
P.col(i) - P_bar;
96 Q.col(i) =
Q.col(i) - Q_bar;
153 for (
int i = 0; i <
n; i++)
155 Eigen::Vector4d q1, q2;
161 Eigen::EigenSolver<Eigen::Matrix4d> es(A);
163 const Eigen::Matrix4d Ae = es.pseudoEigenvalueMatrix();
165 for (
int i=0;i<4;i++) D[i] = Ae(i,i);
167 Eigen::Matrix4d V_mat = es.pseudoEigenvectors();
169 Eigen::Vector4d::Index max_index;
171 D.maxCoeff(&max_index);
175 V = V_mat.col(max_index);
177 Eigen::Quaterniond
q(V(0), V(1), V(2), V(3));
179 R =
q.toRotationMatrix();
187 Eigen::Matrix3d I3 = Eigen::MatrixXd::Identity(3, 3);
189 for (
int i = 0; i <
n; i++)
191 vec = (I3 -
F[i])*
Q.col(i);
192 err2 += vec.squaredNorm();
201 Eigen::VectorXd p_bar;
202 Eigen::Matrix3d sum_F, I3;
203 I3 = Eigen::MatrixXd::Identity(3, 3);
206 p_bar =
P.rowwise().mean();
208 for (i = 0; i<
n; i++)
211 F[i] =
Q.col(i)*
Q.col(i).transpose() /
Q.col(i).squaredNorm();
212 sum_F = sum_F +
F[i];
Eigen::MatrixXd img_pts
Object points in Camera Co-ordinate system.
void xform()
Transform object points in Body frame (Landmark Frame) to estimated Camera Frame. ...
Eigen::MatrixXd P
Camera intrinsic matrix.
double err2
Error variable for convergence selection.
void estimate_t()
Function to estimate translation given an estimated rotation matrix.
Eigen::Matrix4d qMatW(Eigen::VectorXd q)
Iternal Function of quaternion.
Eigen::Matrix3d G
Matrix for internal computations.
Perspective n Point (PnP) Algorithms toolkit for MRPT.
GLdouble GLdouble GLdouble GLdouble q
int n
Error variable for convergence selection.
void absKernel()
Function to compute pose during an iteration.
double err
Storage matrix for each point.
Eigen::MatrixXd Q
Trnaspose of Object points .
Lu Hage Mjolsness - Iterative PnP Algorithm (Eigen Implementation.
std::vector< Eigen::Matrix3d > F
Translation Vector.
lhm(Eigen::MatrixXd obj_pts_, Eigen::MatrixXd img_pts_, Eigen::MatrixXd cam_, int n0)
Number of 2d/3d correspondences.
Eigen::Matrix3d R
Transpose of Image points .
Eigen::Vector3d t
Rotation Matrix.
Eigen::Matrix< dataType, 4, 4 > inverse(Eigen::Matrix< dataType, 4, 4 > &pose)
Eigen::MatrixXd cam_intrinsic
Image points in pixel co-ordinates.
bool compute_pose(Eigen::Ref< Eigen::Matrix3d > R_, Eigen::Ref< Eigen::Vector3d > t_)
Function to compute pose using LHM PnP algorithm.
Eigen::Matrix4d qMatQ(Eigen::VectorXd q)
Iternal Function of quaternion.