2012-02-25 80 views
3

我有一點問題。我編寫了一個程序,使用相機和深度信息在每個幀中提取一組三維點。這些點位於攝像機座標系中,這意味着原點位於攝像機中心,x是水平距離,y垂直距離,z是距攝像機的距離(沿着光軸)。一切都以米爲單位。即點(2,-1,5)沿照相機的光軸向右兩米,下一米和五米。計算攝像機的運動出相應的3d點集

我在每個時間範圍內計算這些點,並且也知道對應關係,就像我知道t-1中的哪個點屬於t中的哪個3d點。

我現在的目標是計算我的世界座標系中每個時間範圍內攝像機的運動(z向上代表高度)。我想計算相對運動,但也是從一些開始位置開始的絕對運動,以便可視化攝像機的軌跡。


這是在相機中的點的一個實例的數據集的一幀與當前(左)和先前的3D位置(右)座標:

-0.174004 0.242901 3.672510 | -0.089167 0.246231 3.646694 
-0.265066 -0.079420 3.668801 | -0.182261 -0.075341 3.634996 
0.092708 0.459499 3.673029 | 0.179553 0.459284 3.636645 
0.593070 0.056592 3.542869 | 0.675082 0.051625 3.509424 
0.676054 0.517077 3.585216 | 0.763378 0.511976 3.555986 
0.555625 -0.350790 3.496224 | 0.633524 -0.354710 3.465260 
1.189281 0.953641 3.556284 | 1.274754 0.938846 3.504309 
0.489797 -0.933973 3.435228 | 0.561585 -0.935864 3.404614 

由於我會喜歡使用OpenCV,如果可能的話,我在OpenCV 2.3中找到了estimateAffine3D()函數,它使用兩個3D點輸入向量並使用RANSAC計算它們之間的仿射變換。

作爲輸出,我得到一個3x4變換矩陣。

我已經試着通過設置RANSAC參數來使計算更準確,但很多時候trnasformation矩陣顯示的是相當大的平移運動。正如你在樣本數據中看到的那樣,運動通常很小。

所以我想問問,如果有人有什麼我可以嘗試的另一個想法? OpenCV是否爲此提供了其他解決方案?

此外,如果我有相機在每個時間範圍內的相對運動,我將如何將其轉換爲世界座標?另外我怎麼會得到從一個點(0,0,0)開始的絕對位置,所以我有每個時間幀的相機位置(和方向)?

如果有人能給我一些建議,那會很棒!

謝謝!

更新1:

@邁克爾Kupchick不錯的答案後,我試圖檢查的OpenCV的estimateAffine3D()函數有多好作品。所以,我創建了兩個小測試集的6點對,只是有一個翻譯,不旋轉,並看看在所產生的變換矩陣:

測試設置1:

1.5 2.1 6.7 | 0.5 1.1 5.7 
6.7 4.5 12.4 | 5.7 3.5 11.4 
3.5 3.2 1.2 | 2.5 2.2 0.2 
-10.2 5.5 5.5 | -11.2 4.5 4.5 
-7.2 -2.2 6.5 | -8.2 -3.2 5.5 
-2.2 -7.3 19.2 | -3.2 -8.3 18.2 

變換矩陣:

1   -1.0573e-16 -6.4096e-17 1 
-1.3633e-16 1   2.59504e-16 1 
3.20342e-09 1.14395e-09 1   1 

測試設置2:

1.5 2.1 0 | 0.5 1.1 0 
6.7 4.5 0 | 5.7 3.5 0 
3.5 3.2 0 | 2.5 2.2 0 
-10.2 5.5 0 | -11.2 4.5 0 
-7.2 -2.2 0 | -8.2 -3.2 0 
-2.2 -7.3 0 | -3.2 -8.3 0 

變換矩陣:

1    4.4442e-17 0 1 
-2.69695e-17 1   0 1 
0    0   0 0 

- >這讓我說一下右一見鍾情兩個轉變矩陣...

假設這是對的,我怎麼會重新計算的軌跡當我在每個時間步有這個變換矩陣?

任何人的任何提示或想法,爲什麼它是壞的?

+0

難道你的結果轉換矩陣的第一行全是零?我的意思是旋轉矩陣的對角線應該全是1或者一些接近的值,你確定你正在正確地閱讀矩陣嗎? – 2012-03-01 11:23:21

+0

哦,對了!我讀了轉換矩陣的權利,但我有一個輸入向量中的錯誤。所以我將轉換矩陣改爲現在的樣子,這對於旋轉和平移更有意義。這不是我正在尋找的那種格式嗎? ICP算法不會給我關於這個數據集的相同嗎? – 2012-03-01 12:23:52

+0

最後一個矩陣仍然看起來很奇怪,從第二行第三列看看1,在第一個矩陣的結果看起來好的 – 2012-03-01 13:48:09

回答

3

這個問題比圖像處理更多地涉及3D。

你要做的是註冊知道的3D,因爲所有的框架都有相同的3d點 - >相機關係,從註冊計算的轉換將是相機運動轉換。

爲了解決這個問題,你可以使用PCL。這是opencv的3D相關任務的姊妹項目。 http://www.pointclouds.org/documentation/tutorials/template_alignment.php#template-alignment 這是一個關於點雲對齊的好教程。

基本上它是這樣的:

對於每對連續幀的3D點對應是已知的,所以你可以使用實現SVD方法

http://docs.pointclouds.org/trunk/classpcl_1_1registration_1_1_transformation_estimation_s_v_d.html

你應該至少有3對應點。

你可以按照教程或實現自己的ransac算法。 這隻會給你一些轉換的粗略估計(如果噪聲不是很大,可能相當不錯),爲了得到準確的轉換,你應該使用上一步計算的猜測變換來應用ICP算法。 ICP這裏描述:

http://www.pointclouds.org/documentation/tutorials/iterative_closest_point.php#iterative-closest-point

這兩個步驟應該給你幀之間的變換的準確估計。

因此,您應該逐步進行配對註冊 - 註冊第一對幀從第一幀到第二個1-> 2進行轉換。用第三個(2-> 3)註冊第二個,然後將1-> 2轉換附加到2-> 3,依此類推。這樣,您將在第一幀爲原點的全局座標系中獲得轉換。

+0

謝謝你的答案!我將檢查它是如何完成PCL庫的。 但是據我所知,ICP算法和我在OpenCV中使用的區別在哪裏?我的意思是確保兩者的工作方式不同,但是他們都不會返回幀之間的相對旋轉和平移嗎?本教程給出了一個4x4矩陣T.我已經嘗試過,它與我從openCV函數獲得的數據一樣。我還創建了一個4x4矩陣P,這是方向和位置。我試圖通過以下方式計算軌跡:P_t = P_t-1 * T_t 不幸的是,這給了我不可能的結果。有任何想法嗎? – 2012-02-29 13:10:50

+0

嘗試檢查estimateAffine3D函數。生成一組3D點,然後使用已知的平移(不旋轉)生成第二個點。嘗試登記這些集合,看看結果是否合理。 – 2012-02-29 13:30:50

+0

謝謝!我在上面的帖子中添加了一個更新,其中顯示了兩個簡單的用於estimateAffine3D()的測試用例...它似乎適用於一個測試用例,但不適用於其他測試用例...所以我想我必須嘗試使用​​PCL庫...或者你有其他想法嗎? – 2012-03-01 10:49:36