class mrpt::vision::pnp::CPnP

This class is used for Pose estimation from a known landmark using a monocular camera.

The toolkit comprises of state of the art PnP (Perspective n Point) algorithms

The Python Bindings pnp_perf_comp.py can be used to generate performance comparison using standard tests between the different algorithms.

<Untitled>

Chandra Mangipudi

17/08/16

#include <mrpt/vision/pnp_algos.h>

class CPnP
{
public:
    //
methods

    bool dls(
        const Eigen::Ref<Eigen::MatrixXd> obj_pts,
        const Eigen::Ref<Eigen::MatrixXd> img_pts,
        int n,
        const Eigen::Ref<Eigen::MatrixXd> cam_intrinsic,
        Eigen::Ref<Eigen::MatrixXd> pose_mat
        );

    bool epnp(
        const Eigen::Ref<Eigen::MatrixXd> obj_pts,
        const Eigen::Ref<Eigen::MatrixXd> img_pts,
        int n,
        const Eigen::Ref<Eigen::MatrixXd> cam_intrinsic,
        Eigen::Ref<Eigen::MatrixXd> pose_mat
        );

    bool upnp(
        const Eigen::Ref<Eigen::MatrixXd> obj_pts,
        const Eigen::Ref<Eigen::MatrixXd> img_pts,
        int n,
        const Eigen::Ref<Eigen::MatrixXd> cam_intrinsic,
        Eigen::Ref<Eigen::MatrixXd> pose_mat
        );

    bool p3p(
        const Eigen::Ref<Eigen::MatrixXd> obj_pts,
        const Eigen::Ref<Eigen::MatrixXd> img_pts,
        int n,
        const Eigen::Ref<Eigen::MatrixXd> cam_intrinsic,
        Eigen::Ref<Eigen::MatrixXd> pose_mat
        );

    bool rpnp(
        const Eigen::Ref<Eigen::MatrixXd> obj_pts,
        const Eigen::Ref<Eigen::MatrixXd> img_pts,
        int n,
        const Eigen::Ref<Eigen::MatrixXd> cam_intrinsic,
        Eigen::Ref<Eigen::MatrixXd> pose_mat
        );

    bool ppnp(
        const Eigen::Ref<Eigen::MatrixXd> obj_pts,
        const Eigen::Ref<Eigen::MatrixXd> img_pts,
        int n,
        const Eigen::Ref<Eigen::MatrixXd> cam_intrinsic,
        Eigen::Ref<Eigen::MatrixXd> pose_mat
        );

    bool posit(
        const Eigen::Ref<Eigen::MatrixXd> obj_pts,
        const Eigen::Ref<Eigen::MatrixXd> img_pts,
        int n,
        const Eigen::Ref<Eigen::MatrixXd> cam_intrinsic,
        Eigen::Ref<Eigen::MatrixXd> pose_mat
        );

    bool lhm(
        const Eigen::Ref<Eigen::MatrixXd> obj_pts,
        const Eigen::Ref<Eigen::MatrixXd> img_pts,
        int n,
        const Eigen::Ref<Eigen::MatrixXd> cam_intrinsic,
        Eigen::Ref<Eigen::MatrixXd> pose_mat
        );
};

Methods

bool dls(
    const Eigen::Ref<Eigen::MatrixXd> obj_pts,
    const Eigen::Ref<Eigen::MatrixXd> img_pts,
    int n,
    const Eigen::Ref<Eigen::MatrixXd> cam_intrinsic,
    Eigen::Ref<Eigen::MatrixXd> pose_mat
    )

hesch Direct Least Squares (DLS) - PnP : Algorithm formulates position as a function of rotation.

Use Cayley’s rotation theorem to represent the rotation using parameters ($s_1, s_2, s_3$). Solve the rotation using multi-variate polynomial expressions

Parameters:

obj_pts

Object points in Camera Co-ordinate system {C} nX3 (only 4 points used) array [p_x, p_y, p_z]

img_pts

Image points in pixels nX3 (only 4 points used) array containing pixel data from camera [u, v, 1]

n

number of 2D-3D correspondences

cam_intrinsic

Camera Intrinsic matrix

pose_mat

Output pose vector 6X1, pose_mat[0:2]-> Translation, pose_mat[3:5] -> Quaternion vector component

Returns:

success flag

bool epnp(
    const Eigen::Ref<Eigen::MatrixXd> obj_pts,
    const Eigen::Ref<Eigen::MatrixXd> img_pts,
    int n,
    const Eigen::Ref<Eigen::MatrixXd> cam_intrinsic,
    Eigen::Ref<Eigen::MatrixXd> pose_mat
    )

lepetit Efficient-PnP (EPnP) - Algorithm takes 4 control points based on n points and uses the control points to compute the pose

Parameters:

obj_pts

Object points in Camera Co-ordinate system {C} nX3 (only 4 points used) array [p_x, p_y, p_z]

img_pts

Image points in pixels nX3 (only 4 points used) array containing pixel data from camera [u, v, 1]

n

number of 2D-3D correspondences

cam_intrinsic

Camera Intrinsic matrix

pose_mat

Output pose vector 6X1, pose_mat[0:2]-> Translation, pose_mat[3:5] -> Quaternion vector component

Returns:

success flag

bool upnp(
    const Eigen::Ref<Eigen::MatrixXd> obj_pts,
    const Eigen::Ref<Eigen::MatrixXd> img_pts,
    int n,
    const Eigen::Ref<Eigen::MatrixXd> cam_intrinsic,
    Eigen::Ref<Eigen::MatrixXd> pose_mat
    )

Kneip2014 Unified-PnP (UPnP) : Algorithm to compute pose from unknown camera intrinsic matrix

Parameters:

obj_pts

Object points in Camera Co-ordinate system {C} nX3 (only 4 points used) array [p_x, p_y, p_z]

img_pts

Image points in pixels nX3 (only 4 points used) array containing pixel data from camera [u, v, 1]

n

number of 2D-3D correspondences

cam_intrinsic

Camera Intrinsic matrix

pose_mat

Output pose vector 6X1, pose_mat[0:2]-> Translation, pose_mat[3:5] -> Quaternion vector component

Returns:

success flag

bool p3p(
    const Eigen::Ref<Eigen::MatrixXd> obj_pts,
    const Eigen::Ref<Eigen::MatrixXd> img_pts,
    int n,
    const Eigen::Ref<Eigen::MatrixXd> cam_intrinsic,
    Eigen::Ref<Eigen::MatrixXd> pose_mat
    )

kneip P3P - A closed form solution for n=3, 2D-3D correspondences

Parameters:

obj_pts

Object points in Camera Co-ordinate system {C} nX3 (only 4 points used) array [p_x, p_y, p_z]

img_pts

Image points in pixels nX3 (only 4 points used) array containing pixel data from camera [u, v, 1]

n

number of 2D-3D correspondences

cam_intrinsic

Camera Intrinsic matrix

pose_mat

Output pose vector 6X1, pose_mat[0:2]-> Translation, pose_mat[3:5] -> Quaternion vector component

Returns:

success flag

bool rpnp(
    const Eigen::Ref<Eigen::MatrixXd> obj_pts,
    const Eigen::Ref<Eigen::MatrixXd> img_pts,
    int n,
    const Eigen::Ref<Eigen::MatrixXd> cam_intrinsic,
    Eigen::Ref<Eigen::MatrixXd> pose_mat
    )

xie Robust (R-PnP)- A closed form solution with intermediate P3P computations

Parameters:

obj_pts

Object points in Camera Co-ordinate system {C} nX3 (only 4 points used) array [p_x, p_y, p_z]

img_pts

Image points in pixels nX3 (only 4 points used) array containing pixel data from camera [u, v, 1]

n

number of 2D-3D correspondences

cam_intrinsic

Camera Intrinsic matrix

pose_mat

Output pose vector 6X1, pose_mat[0:2]-> Translation, pose_mat[3:5] -> Quaternion vector component

Returns:

success flag

bool ppnp(
    const Eigen::Ref<Eigen::MatrixXd> obj_pts,
    const Eigen::Ref<Eigen::MatrixXd> img_pts,
    int n,
    const Eigen::Ref<Eigen::MatrixXd> cam_intrinsic,
    Eigen::Ref<Eigen::MatrixXd> pose_mat
    )

garro Procrustes-PnP(PPnP) Algorithm : Iterative SVD based algorithm

Parameters:

obj_pts

Object points in Camera Co-ordinate system {C} nX3 array [p_x, p_y, p_z]

img_pts

Image points in pixels nX3 array containing pixel data from camera [u, v, 1]

n

number of 2D-3D correspondences

cam_intrinsic

Camera Intrinsic matrix

pose_mat

Output pose vector 6X1, pose_mat[0:2]-> Translation, pose_mat[3:5] -> Quaternion vector component

Returns:

success flag

bool posit(
    const Eigen::Ref<Eigen::MatrixXd> obj_pts,
    const Eigen::Ref<Eigen::MatrixXd> img_pts,
    int n,
    const Eigen::Ref<Eigen::MatrixXd> cam_intrinsic,
    Eigen::Ref<Eigen::MatrixXd> pose_mat
    )

dementhon Pose from Orthogoanlity and Scaling :Iterative (POSIT) - A Geometric algorithm to compute scale and orthogonality independently

Parameters:

obj_pts

Object points in Camera Co-ordinate system {C} nX3 array [p_x, p_y, p_z]

img_pts

Image points in pixels nX3 array containing pixel data from camera [u, v, 1]

n

number of 2D-3D correspondences

cam_intrinsic

Camera Intrinsic matrix

pose_mat

Output pose vector 6X1, pose_mat[0:2]-> Translation, pose_mat[3:5] -> Quaternion vector component

Returns:

success flag

bool lhm(
    const Eigen::Ref<Eigen::MatrixXd> obj_pts,
    const Eigen::Ref<Eigen::MatrixXd> img_pts,
    int n,
    const Eigen::Ref<Eigen::MatrixXd> cam_intrinsic,
    Eigen::Ref<Eigen::MatrixXd> pose_mat
    )

lu Lu-Hager-Mjolsness(LHM)-PnP algorithm : Iterative algorithm to reduce object space error

Parameters:

obj_pts

Object points in Camera Co-ordinate system {C} nX3 array [p_x p_y p_z]

img_pts

Image points in pixels nX3 array containing pixel data from camera [u, v, 1]

n

number of 2D-3D correspondences

cam_intrinsic

Camera Intrinsic matrix

pose_mat

Output pose vector 6X1, pose_mat[0:2]-> Translation, pose_mat[3:5] -> Quaternion vector component

Returns:

success flag