14 #include <Eigen/Dense> 21 const Eigen::MatrixXd& obj_pts,
const Eigen::MatrixXd& img_pts,
22 const Eigen::MatrixXd& cam_intrinsic)
30 Eigen::Matrix3d&
R, Eigen::Vector3d& t,
int n)
34 Eigen::MatrixXd I = Eigen::MatrixXd::Identity(n, n),
A(n, n), Y(n, 3),
35 E(n, 3), E_old(n, 3), U, V,
36 I3 = Eigen::MatrixXd::Identity(3, 3), PR,
37 Z = Eigen::MatrixXd::Zero(n, n);
38 Eigen::VectorXd e(n), II(n), c(3), Zmindiag(n);
41 II.fill(1.0 / ((
double)n));
43 A = I - e * e.transpose() / n;
45 double err = std::numeric_limits<double>::infinity();
53 Eigen::JacobiSVD<Eigen::MatrixXd> svd(
54 P.transpose() * Z *
A * S,
55 Eigen::ComputeThinU | Eigen::ComputeThinV);
59 I3(2, 2) = (U * V.transpose()).determinant();
60 R = U * I3 * V.transpose();
63 c = (S - Z * PR).transpose() * II;
65 Y = S - e * c.transpose();
67 Zmindiag = ((PR * Y.transpose()).diagonal()).array() /
68 ((P.array() * P.array()).rowwise().sum()).array();
70 for (
int i = 0; i < n; i++)
71 if (Zmindiag(i) < 0) Zmindiag(i) = 0;
73 Z = Zmindiag.asDiagonal();
77 err = (E - E_old).
norm();
Eigen::MatrixXd S
Image points in pixels.
ppnp(const Eigen::MatrixXd &obj_pts, const Eigen::MatrixXd &img_pts, const Eigen::MatrixXd &cam_intrinsic)
Constructor for the P-PnP class.
bool compute_pose(Eigen::Matrix3d &R, Eigen::Vector3d &t, int n)
Function to compute pose.
Eigen::MatrixXd C
Object points in Camera Co-ordinate system.
CONTAINER::Scalar norm(const CONTAINER &v)