===== Toolbox of Elementary and Helper Functions ===== Following functions should be implemented. It is important to keep the specified calling convention (order of arguments, shape of matrices, etc). Note: vectors of coordinates (e.g., points) should be :!: **always columns** :!:. Thus a set of 5 euclidean points in a plane is written as a matrix with 2 rows and 5 columns (i.e., 2 x 5). === e2p — Transformation of euclidean to projective coordinates === | //Synopsis// | ''u_p = e2p( u_e )'' || | //Inputs// | ''u_e'' | d by n matrix; n euclidean vectors of dimension d | | //Outputs// | ''u_p'' | d+1 by n matrix; n homogeneous vectors of dimension d+1 | === p2e — Transformation of projective to euclidean coordinates === | //Synopsis// | ''u_e = p2e( u_p )'' || | //Inputs// | ''u_p'' | d+1 by n matrix; n homogeneous vectors of dimension d+1 | | //Outputs// | ''u_e'' | d by n matrix; n euclidean vectors of dimension d | >> u = e2p( [[1;2] [3;4] [5;6]] ) u = 1 3 5 2 4 6 1 1 1 >> p2e( u ) ans = 1 3 5 2 4 6 === vlen — Column vectors length === | //Synopsis// | ''l = vlen( x )'' || | //Inputs// | ''x'' | d by n matrix; n vectors of dimension d | | //Outputs// | ''l'' | 1 by n row vector; euclidean lengths of the vectors | >> vlen( [ [0.5;0.5;1] [3;4;0]]) ans = 1.2247 5.0000 === sqc — Skew-symmetric matrix for cross-product === | //Synopsis// | ''S = sqc(x)'' || | //Inputs// | ''x'' | vector 3×1 | | //Outputs// | ''S'' | skew symmetric matrix (3×3) for cross product with ''x''| Notes: The vector ''x'' characterises the left as well as the right null space of the matrix ''S''. For any vector ''y'', cross product ''x''×''y'' equals to ''S'' ''y''. >> sqc( [1;2;3] ) ans = 0 -3 2 3 0 -1 -2 1 0 === EutoRb — Essential matrix decomposition with cheirality === This is obsolete, create EutoRt instead. | //Synopsis// | ''[R, b] = EutoRb( E, u1, u2 )'' || | //Inputs// | ''E'' | essential matrix (3×3) | | | ''u1'', ''u2'' | corresponding image points in homogeneous coordinates (3×n), used for cheirality test | | //Outputs// | ''R'' | relative rotation (3×3) or [] if cheirality fails | | | ''b'' | relative translation, euclidean (3×1), unit length | Notes: The sessential matrix ''E'' is decomposed such that ''E = R * sqc( b )''. === EutoRt — Essential matrix decomposition with cheirality === | //Synopsis// | ''[R, t] = EutoRt( E, u1, u2 )'' || | //Inputs// | ''E'' | essential matrix (3×3) | | | ''u1'', ''u2'' | corresponding image points in homogeneous coordinates (3×n), used for cheirality test | | //Outputs// | ''R'' | relative rotation (3×3) or [] if cheirality fails | | | ''t'' | relative translation, euclidean (3×1), unit length | Notes: The sessential matrix ''E'' is decomposed such that ''E ~ sqc(t) * R''. Note that ''t = -R*b''. === Pu2X — Binocular reconstruction by DLT triangulation === | //Synopsis// | ''X = Pu2X( P1, P2, u1, u2 )'' || | //Inputs// | ''P1, P2'' | projective camera matrices (3×4) | | | ''u1'', ''u2'' | corresponding image points in homogeneous coordinates (3×n) | | //Outputs// | ''X'' | reconstructed 3D points, homogeneous (4×n) | === err_F_sampson — Sampson error on epipolar geometry === | //Synopsis// | ''err = err_F_sampson( F, u1, u2 )'' || | //Inputs// | ''F'' | fundamental matrix (3×3) | | | ''u1'', ''u2'' | corresponding image points in homogeneous coordinates (3×n) | | //Outputs// | ''e'' | Squared Sampson error for each correspondence (1×n). | === u_correct_sampson — Sampson correction of correspondences === | //Synopsis// | ''[nu1, nu2] = u_correct_sampson( F, u1, u2 )'' || | //Inputs// | ''F'' | fundamental matrix (3×3) | | | ''u1'', ''u2'' | corresponding image points in homogeneous coordinates (3×n) | | //Outputs// | ''nu1,nu2'' | corrected corresponding points, homog. (3×n). |