0
votes

I am trying to reconstruct a scene in 3D based on iamge features and projection matrices (computed through feature matching and essential matrix computation) of two cameras, all of this in OpenCV. I am encountering a strange problem with this.

Mainly, the accuracy of the triangulation of points and scene reconstruction is extremely sensitive to the R matrix. To test this, I ran a test with simulated object points propagated through two projection matrices (to simulate the stereo). The object points are a 6x6 square; x:{0 to 1 in steps of 0.2}, y:{0 to 1 in steps of 0.2}, z:{all 10}. P1 is [I|0] in both cases, P2 is [R|t], where:

R1 = 0.9995726521705084, -0.003399231961472978, -0.02903374338399459, 
    0.003763143573699675, 0.9999149324186841, 0.01248866192120443, 
    0.02898882169490978, -0.01259258306347518, 0.9995004127405501
t1 = [0.999, 0.01, 0.01]

R2 = 0.9989054656616956, -0.005509540027623473, 0.04644906500539195, 
    0.004867423001511094, 0.9998911828244373, 0.01392590044744823, 
    -0.04652073585526645, -0.01368457082381193, 0.9988235848521261
t2 = [0.999, 0.02, 0.01]

I thought these two R matrices were close enough to be considered as accurate. But the triangulation results seem to think otherwise..

With R as identity:  (close to perfect reconstruction)

[5.0598763e-05, -0.0063825068, 9.9969149;
4.8001177e-05, 0.19379893, 9.9967384;
4.6123398e-05, 0.39403415, 9.9965773;
4.3485958e-05, 0.59420204, 9.9964066;
4.0845167e-05, 0.79436392, 9.9962406;
3.8896389e-05, 0.99458051, 9.996089;
0.19970703, -0.0063951053, 9.9936533;
0.19969735, 0.19372027, 9.9934254;
0.19968878, 0.39388725, 9.9932156;
0.19967939, 0.59398526, 9.9929981;
0.19967027, 0.79407561, 9.9927874;
0.19966206, 0.99421865, 9.99259;
0.39928076, -0.0064075897, 9.9915905;
0.39926201, 0.19366568, 9.991312;
0.39924476, 0.39378849, 9.9910526;
0.39922675, 0.5938406, 9.9907885;
0.39920929, 0.79388332, 9.9905319;
0.39919299, 0.99397665, 9.9902887;
0.59869993, -0.0064199544, 9.9883261;
0.59867001, 0.19358718, 9.987998;
0.59864205, 0.39364177, 9.987689;
0.59861356, 0.593624, 9.9873781;
0.59858596, 0.79359502, 9.9870768;
0.5985598, 0.99361473, 9.9867878;
0.79777306, -0.0064321696, 9.9838686;
0.79773003, 0.19348493, 9.98349;
0.79768944, 0.39344737, 9.9831314;
0.79764849, 0.59333575, 9.9827728;
0.79760903, 0.79321122, 9.9824266;
0.79757106, 0.99313337, 9.9820919;
0.99702829, -0.0064441776, 9.9818068;
0.99697012, 0.19343086, 9.9813776;
0.99691486, 0.39334908, 9.9809694;
0.99685961, 0.59319156, 9.9805641;
0.99680638, 0.79301941, 9.9801722]

Using R1|t1:

[0.0006948277, -0.057961587, 7.7867656;
0.00076079171, 0.097548366, 7.7840567;
0.00082782045, 0.25295791, 7.781354;
0.00089472742, 0.40817291, 7.7786431;
0.00096202898, 0.56324077, 7.7759318;
0.0010304272, 0.71820831, 7.7732263;
0.1562658, -0.058364984, 7.7859602;
0.15625301, 0.097173139, 7.7831898;
0.15624109, 0.25260818, 7.7804236;
0.15622856, 0.407846, 7.7776465;
0.15621613, 0.5629338, 7.7748661;
0.15620455, 0.71791828, 7.772089;
0.31177881, -0.058764182, 7.7844906;
0.31168443, 0.096788943, 7.7816563;
0.31159076, 0.25223625, 7.7788253;
0.31149602, 0.40748379, 7.7759824;
0.3114011, 0.5625785, 7.7731342;
0.31130677, 0.71756685, 7.7702885;
0.46710756, -0.05914975, 7.7809157;
0.46692884, 0.096376404, 7.7780185;
0.46675056, 0.25179401, 7.7751222;
0.46657094, 0.40700936, 7.7722144;
0.46639091, 0.5620693, 7.7693019;
0.46621126, 0.71701992, 7.7663894;
0.6220336, -0.059520967, 7.7752504;
0.62176758, 0.095936403, 7.7722869;
0.62150216, 0.25128254, 7.7693276;
0.62123501, 0.40642393, 7.766356;
0.62096751, 0.56140751, 7.763382;
0.6207003, 0.71627909, 7.7604065;
0.77683568, -0.0598915, 7.7696557;
0.77647918, 0.095498636, 7.7666249;
0.77612352, 0.25077474, 7.7635999;
0.77576625, 0.4058437, 7.7605648;
0.77540869, 0.56075233, 7.7575278]

Using R2|t2:

[0.00092721562, -0.13777997, 18.777367;
 0.00076921738, 0.2374147, 18.73959;
0.00061207288, 0.61111385, 18.701971;
0.00045474528, 0.9831, 18.664478;
0.0002978587, 1.3534971, 18.627134;
0.00014151275, 1.7224245, 18.58993;
0.37676802, -0.13919897, 18.809832;
0.3757931, 0.23646803, 18.771765;
0.37482125, 0.61062753, 18.733831;
0.37385073, 0.98306084, 18.695993;
0.37288278, 1.3538899, 18.658278;
0.37191704, 1.7232322, 18.62067;
0.75461411, -0.14074895, 18.859949;
0.75280511, 0.23574051, 18.821489;
0.75099939, 0.61070609, 18.783117;
0.74919492, 0.98392648, 18.744808;
0.74739331, 1.3555217, 18.706583;
0.74559367, 1.7256067, 18.668427;
1.1350268, -0.14237344, 18.919434;
1.132362, 0.23512313, 18.880507;
1.1296982, 0.61107594, 18.841614;
1.127033, 0.98526078, 18.802734;
1.1243687, 1.357795, 18.763895;
1.1217037, 1.7287903, 18.725073;
1.5183519, -0.14407407, 18.988445;
1.5148053, 0.23461713, 18.948969;
1.5112541, 0.61174142, 18.909468;
1.5076962, 0.98707068, 18.869923;
1.5041342, 1.3607191, 18.830359;
1.5005655, 1.7327945, 18.790751;
1.9069529, -0.14595015, 19.080332;
1.9024866, 0.2343885, 19.040174;
1.8980062, 0.6131314, 18.999918;
1.8935097, 0.99004531, 18.959545;
1.889001, 1.3652413, 18.91909]

The accuracy of t is not causing any problems of this magnitude. Surely, a ~0.01 differences in the rotation shouldn't cause such bad reconstruction.. Can anyone shed some light on what might be going wrong here? I tried two methods of triangulation, one that's inbuilt into opencv (cv::triangulatePoints()) and another an iterative least squares method explained in the Hartley and Zisserman book. My pipeline is this: input image points -> homogenize using K matrices -> triangulate -> "unhomogenize" obtained 4d points to obtain 3d. Thanks for your time!

1

1 Answers

4
votes

0.01 is quite significant, actually. asin(0.01) is about 0.5 degree, which over a distance can have quite an impact on triangulation results.

If you want to look at the numbers with better perspective, try to extract the euler angles from the matrix, and consider those instead.

https://d3cw3dd2w32x2b.cloudfront.net/wp-content/uploads/2012/07/euler-angles1.pdf