2012-10-16 16 views
3

我工作的一個項目,在那裏我只有1個靜態相機(不動),但上面有3點物面由3個三角形的旋轉和平移(它的一個平面,所以z方向上的點的差值爲零)。相機始終處於相同的位置,飛機在空間中移動和旋轉。我已經校準了25個棋盤圖像和功能:如何找到3個紅外LED

calibrateCamera(object_points, image_points, image.size(), intrinsic, distCoeffs, rvecs,  tvecs); 

和不失真工作正常。現在我讓opencv(C++)將intrinsics和distCoeffs寫入一個xml文件。

我怎麼能在一個新的程序中使用這些參數,發現3點形成一個三角形(帶LED燈紅外線的製造),並返回我這個三角形的旋轉和平移?

+0

準確地說你的問題是什麼?你在問代碼嗎? – jlengrand

+0

對不起,jonsca編輯我的文字。我的問題是在這個缺失的文字:「但現在我卡住了。任何建議如何繼續?? :( 在此先感謝, escore。」我不需要代碼,但也許一些指示/命令,我應該谷歌要知道如何繼續從這一點上。謝謝! –

+0

請不要全部編輯我的文本!!看看這是如何使問題? –

回答

1

2D情況下

答案的這一部分只討論剛體運動在平面,所以它不完全匹配的問題。

假設你已經確定你的觀點,這似乎根據your comment工作。現在您可以計算這些點之間的距離並對它們進行排序。兩個檢測點之間的最短距離應與原始三角形的最短邊相對應,依此類推。有了這些信息,你可以標記您的點作爲一個Ç

接下來,您移動(平移)的所有點,這樣一個點位於原點之後。這是假設你原來的三角形在原點有一個角落。讓我們假設A位於原點,無論是在原始三角形還是在移動的點集中。此向量的否定版本表示您的三角形的翻譯

現在輪換。假定此時,對於原來的三角形,位於正X軸,即,具有Ŷ = 0和X> 0。現在可以採取點的(移動)位置B,並使用其座標的atan2,您可以確定軸ABx軸之間的角度。所以這是你的三角形的角度輪轉

您可以將這兩個組合成一個仿射變換。如果原始三角形不與在原點和位於X軸的正的部分,然後就可以使用類似的技術來確定的原始三角形如何涉及一個具有所描述的特性。

3D情況下

對於空間的剛性運動,我沒有準備好使用的解決方案。只有一個想法。假設您的相機位於原點,並且您分析的圖像被嵌入在 z = 1。然後將圖像中的點( Xÿ)對應於一個點( Xÿ,1)在該嵌入位置,並穿過該點的射線是由該座標倍數給出即(λx,λy,λ)。因此,從圖像中的點 A, B C的位置開始,可以基於每個點的單個變量計算相應的空間點。 a c

現在您的任務是選擇這三個變量,以便空間中各點之間的距離與三角形的邊長相匹配。這導致三個變量的系統有三個變量:

(a - b)^2 + (Ay*a - By*b)^2 + (Ax*a - Bx*b)^2 == AB^2 
(a - c)^2 + (Ay*a - Cy*c)^2 + (Ax*a - Cx*c)^2 == AC^2 
(b - c)^2 + (By*b - Cy*c)^2 + (Bx*b - Cx*c)^2 == BC^2 

不幸的是,這些方程不是線性的。你所有的變量都有正方形。簡單地將它們送入計算機代數系統尚未爲我提供明確的解決方案。我想可能有數字方法來找到使用一些迭代過程的近似值,但是您必須對此進行一些研究。

一旦你有了3D座標,通過比較來計算這些變換應該是簡單的。這完全取決於你想要描述旋轉的格式。

+0

這僅用於2D翻譯和旋轉,對嗎?我需要3D翻譯和旋轉每個軸/點。我認爲最簡單的方法是,我翻譯它的中心並在之後旋轉圍繞中間值的三角形。我想到的一種方法是使用單純形法(或任何其他類似的算法)。感謝您的回答! –

+0

也有幫助的是知道如何從calibrateCamera獲得投影矩陣(我有內在和失真)。我想計算從3d點到圖片上的點.. –

+0

這是僅限2D,是的。我誤解了你的問題。不確定三維重建是否可能只有三點。如果你知道哪一點是哪一點,自由度似乎還不夠,但我猜POSIT需要四點。 – MvG