ydsf16/PnP_Solver

different result with Eigen 3.2.0 and Eigen 3.3.4

Opened this issue · 0 comments

I ran a simple program in two systems. Mac with Eigen3.3.4 and Linux with Eigen3.2.0. I got super different results.

Here's my code.

Eigen::Matrix3d m_K = Eigen::Matrix3d::Identity();
    m_K(0, 0) = 672.062;
    m_K(1, 1) = 674.562;
    m_K(0, 2) = 398.838;
    m_K(1, 2) = 279.38;

    std::vector< Eigen::Vector3d > vecPts3d;
    std::vector< Eigen::Vector2d > vecPts2d;

    Eigen::Vector3d p3d0(492.681, 1.73013, 159.257);
    Eigen::Vector3d p3d1(493.724, -4.69578, 69.9289);
    Eigen::Vector3d p3d2(597.975, -10.3263, 9.82591);
    Eigen::Vector3d p3d3(623.276, -9.67869, -303.368);
    Eigen::Vector3d p3d4(502.611, -4.8012, 66.27);

    Eigen::Vector2d p2d0(507.6, 327.6);
    Eigen::Vector2d p2d1(624.248, 239.454);
    Eigen::Vector2d p2d2(222.731, 263.926);
    Eigen::Vector2d p2d3(432.868, 275.006);
    Eigen::Vector2d p2d4(561.6, 244.384);

    vecPts3d.emplace_back(p3d0);
    vecPts3d.emplace_back(p3d1);
    vecPts3d.emplace_back(p3d2);
    vecPts3d.emplace_back(p3d3);
    vecPts3d.emplace_back(p3d4);
    vecPts2d.emplace_back(p2d0);
    vecPts2d.emplace_back(p2d1);
    vecPts2d.emplace_back(p2d2);
    vecPts2d.emplace_back(p2d3);
    vecPts2d.emplace_back(p2d4);

    Eigen::Matrix3d R;
    Eigen::Vector3d t;

    solvePnPbyEPnP(m_K, vecPts3d, vecPts2d, R, t);
    std::cout << R << std::endl;
    std::cout << t.transpose() << std::endl;

With Mac&Eigen3.3.4, I got

-0.947487  0.0657636  -0.312958
 0.0680975   0.997673 0.00347973
  0.312459 -0.0180147   -0.94976
  521.61 -34.9744  13.0391

With Linux&Eigen3.2.0 I got

 -0.931891   0.142008  -0.333785
 -0.142497  -0.989524 -0.0231554
 -0.333577   0.025985   0.942365
-1.94579e+156 -6.07921e+156  2.88192e+158

Also I tried Mac&Eigen3.2.0, another differnt result.

-0.946419 0.0664846  0.316023
0.0906903  0.993916 0.0624984
-0.309945 0.0878099 -0.946691
 5336.94 -628.954  38868.5