14 #include <Eigen/Dense> 20 const Eigen::MatrixXd& obj_pts,
const Eigen::MatrixXd& img_pts,
21 const Eigen::MatrixXd& cam_intrinsic)
29 Eigen::Matrix3d&
R, Eigen::Vector3d&
t,
int n)
33 Eigen::MatrixXd I = Eigen::MatrixXd::Identity(
n,
n), A(
n,
n), Y(
n, 3),
34 E(
n, 3), E_old(
n, 3), U, V,
35 I3 = Eigen::MatrixXd::Identity(3, 3), PR,
36 Z = Eigen::MatrixXd::Zero(
n,
n);
37 Eigen::VectorXd e(
n), II(
n),
c(3), Zmindiag(
n);
40 II.fill(1.0 / ((
double)
n));
42 A = I - e * e.transpose() /
n;
44 double err = std::numeric_limits<double>::infinity();
52 Eigen::JacobiSVD<Eigen::MatrixXd> svd(
53 P.transpose() * Z * A * S,
54 Eigen::ComputeThinU | Eigen::ComputeThinV);
58 I3(2, 2) = (U * V.transpose()).determinant();
59 R = U * I3 * V.transpose();
64 Y = S - e *
c.transpose();
66 Zmindiag = ((PR * Y.transpose()).diagonal()).array() /
67 ((P.array() * P.array()).rowwise().sum()).array();
69 for (
int i = 0; i <
n; i++)
70 if (Zmindiag(i) < 0) Zmindiag(i) = 0;
72 Z = Zmindiag.asDiagonal();
76 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.
GLsizei GLboolean transpose
Eigen::MatrixXd C
Object points in Camera Co-ordinate system.
CONTAINER::Scalar norm(const CONTAINER &v)