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:
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
source to share
No one has answered this question yet
Check out similar questions: