2013-01-16 71 views
3

我試圖使用OpenCV的捆綁調整:LevMarqSparse :: bundleAdjust 不幸的是,輸出似乎完全錯誤:OpenCV的捆綁調整

Iteration: 0, normError: 4.30244e+46 (3.64614e+44) 
decreasing lambda to 0.024556 
Iteration: 1, normError: 2.72985e+31 (2.31343e+29) 
decreasing lambda to 0.0024556 
Iteration: 2, normError: 8.00302e+25 (6.78222e+23) 
move failed: lambda = 0.024556, e2 = 2.62043e+40 (2.2207e+38) > 8.00302e+25(6.78222e+23) 
move failed: lambda = 0.24556, e2 = 7.31034e+40 (6.1952e+38) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 2.4556, e2 = 1.59706e+40 (1.35344e+38) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 24.556, e2 = 1.33882e+40 (1.13459e+38) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 245.56, e2 = 1.31518e+40 (1.11456e+38) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 2455.6, e2 = 1.31283e+40 (1.11257e+38) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 24556, e2 = 1.3126e+40 (1.11237e+38) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 245560, e2 = 1.31257e+40 (1.11235e+38) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 2.4556e+06, e2 = 1.31257e+40 (1.11235e+38) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 2.4556e+07, e2 = 1.31257e+40 (1.11235e+38) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 2.4556e+08, e2 = 1.31257e+40 (1.11235e+38) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 2.4556e+09, e2 = 1.31257e+40 (1.11235e+38) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 2.4556e+10, e2 = 1.3125e+40 (1.11229e+38) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 2.4556e+11, e2 = 1.31102e+40 (1.11103e+38) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 2.4556e+12, e2 = 1.3103e+40 (1.11042e+38) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 2.4556e+13, e2 = 1.31471e+40 (1.11416e+38) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 2.4556e+14, e2 = 1.29156e+40 (1.09454e+38) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 2.4556e+15, e2 = 1.15709e+40 (9.80585e+37) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 2.4556e+16, e2 = 3.81423e+39 (3.2324e+37) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 2.4556e+17, e2 = 6.59182e+36 (5.58629e+34) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 2.4556e+18, e2 = 8.07694e+34 (6.84487e+32) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 2.4556e+19, e2 = 7.73149e+52 (6.55211e+50) > 8.00302e+25 (6.78222e+23) 
move failed: lambda = 2.4556e+20, e2 = 2.061e+40 (1.74661e+38) > 8.00302e+25 (6.78222e+23) 
decreasing lambda to 2.4556e+19 

如果我手動重新投影我的第一個猜測我的關鍵點,我收到了總(總和)每個關鍵點與其三角點的重投影之間的歐幾里得距離(以像素爲單位)(誤差)爲169.541 。 在調用LevMarqSparse :: bundleAdjust之後進行相同的錯誤檢查會導致5.50025e + 12的錯誤。

有人能請我指出正確的方向嗎?謝謝。

回答

1

一般來說,當這樣的事情與束調整發生下列錯誤至少一個很可能:

  1. 的2D投影不是3D點正確的,使一個三維點被重新投影到錯誤的2D投影上,因此重投影誤差將非常大。 2D投影和3D點之間的索引可能已經發生了變化。
  2. 您使用的相機不在OpenCV所要求的相同座標系中。想象一下旋轉約180°或反向運動,3D點將投影在某處,但肯定不在正確的2D位置。所以,也許嘗試拍攝反相機矩陣。如果P是4×4均勻投影矩陣之一,則用P.inv()代替P.

這將有助於獲得平均重投影誤差。這個總和並不是很有意義,因爲我們不知道你在重建中有多少3D點和2D投影。