Choosing the Right Core Matrix

I want to code the sfm pipeline itself using Matlab because I need some outputs that opencv functions don't provide. However, I am using opencv for comparison.

The Opencv function [E,mask] = cv.findEssentialMat(points1, points2, 'CameraMatrix',K, 'Method','Ransac');

provides an essential matrix solution using the five-point Nister and RANSAC algorithm.

higher indices are found using: InliersIndices=find(mask>0);

I used this Matlab fix of Nister's algorithm:

Fivepoint_algoithm_code

The function call is as follows:

[E_all, R_all, t_all, Eo_all] = five_point_algorithm( pts1, pts2, K, K);

      

The algorithm outputs up to 10 solutions of essential matrices. However, I ran into the following problems:

  • The above change only applies to perfect matches (no Ransac) and I am providing Algorithm 5 matching with InliersIndices

    , the derived base matrices (up to 10) are all different from those returned by Opencv.
  • All the main matrices returned should be solutions, so why when I triangulate for each one using the following function, I don't get the same 3D points?
  • How to choose the right marix solution you need?

I am triangulating using Matlab toolbox function

Projection matrices:

P1=K*[eye(3) [0;0;0]];
P2=K*[R_all{i} t_all{i}];

[pts3D,rep_error] = triangulate(pts1', pts2', P1',P2');

      

Edit

Returned E from [E,mask] = cv.findEssentialMat(points1, points2, 'CameraMatrix',K, 'Method','Ransac');

E =

    0.0052   -0.7068    0.0104
    0.7063    0.0050   -0.0305
   -0.0113    0.0168    0.0002

      

For a 5-point Matlab implementation, 5 random indices from the rulers are taken as follows:

pts1 =

  736.7744  740.2372  179.2428  610.5297  706.8776
  112.2673  109.9687   45.7010   91.4371   87.8194

pts2 =

  722.3037  725.3770  150.3997  595.3550  692.5383
  111.7898  108.6624   43.6847   90.6638   86.8139

K =

  723.3631    7.9120  601.7643
   -3.8553  719.6517  182.0588
    0.0075    0.0044    1.0000

      

and 4 solutions are returned:

E1 =

   -0.2205    0.9436   -0.1835
    0.8612    0.2447   -0.1531
    0.4442   -0.0600   -0.0378

 E2 =

   -0.2153    0.9573    0.1626
    0.8948    0.2456   -0.3474
    0.1003    0.1348   -0.0306
E3 =

    0.0010   -0.9802   -0.0957
    0.9768    0.0026   -0.1912
    0.0960    0.1736   -0.0019
E4 =

   -0.0005   -0.9788   -0.1427
    0.9756    0.0021   -0.1658
    0.1436    0.1470   -0.0030

      

Edit2:

pts1 and pts2 when triangulated using the essential matrix E, R and t returned by [R, t] = cv.recoverPose(E, p1, p2,'CameraMatrix',K);

X1 =

   -0.0940    0.0478   -0.4984
   -0.0963    0.0497   -0.4987
    0.3033    0.1009   -0.5202
   -0.0065    0.0636   -0.5053
   -0.0737    0.0653   -0.5011

      

from

R =

   -0.9977   -0.0063    0.0670
    0.0084   -0.9995    0.0305
    0.0667    0.0310    0.9973

      

and

t =

    0.0239
    0.0158
    0.9996

      

When triangulating with Matlab code, the selected solution E_all{2}

R_all{2}=

   -0.8559   -0.2677    0.4425
   -0.1505    0.9475    0.2821
   -0.4948    0.1748   -0.8512

      

and

t_all{2}=

   -0.1040
   -0.1355
    0.9853

X2 =

    0.1087   -0.0552    0.5762
    0.1129   -0.0578    0.5836
    0.4782    0.1582   -0.8198
    0.0028   -0.0264    0.2099
    0.0716   -0.0633    0.4862

      

By doing

X1./X2

ans =

   -0.8644   -0.8667   -0.8650
   -0.8524   -0.8603   -0.8546
    0.6343    0.6376    0.6346
   -2.3703   -2.4065   -2.4073
   -1.0288   -1.0320   -1.0305

      

There is an almost constant scale factor between triangulated 3D points. However, the rotation matrices are different and there is no scale factor between translations.

 t./t_all{2}=
       -0.2295
       -0.1167
        1.0145

      

which makes the trajectory wrong

+3


source to share





All Articles