我在代表四邊形(不一定是正方形或矩形)的視頻(或圖像)中有4個共麪點,我希望能夠在虛擬立方體上顯示虛擬立方體其中頂部立方體的角落正好站在視頻四角的角落。由於點是共面的,我可以計算單位平方的角點(即[0,0] [0,1] [1,0] [1,1])和視頻座標之間的單應性四。基於4個共麪點的單應矩陣計算攝像機姿態
從這個單應性我應該能夠計算正確的相機姿態,即[R | t]其中R是3x3旋轉矩陣,t是3x1平移矢量,以便虛擬立方體位於視頻四邊形上。
我有(其中的一些SO)讀了很多的解決方案,並試圖實現他們,但他們似乎只能在一些「簡單」的情況下工作,但不會在大多數情況下(當視頻四是正方形等)。
這裏是我嘗試的方法(大多數是基於相同的原理,只有翻譯的計算略有不同)。設K是相機的固有矩陣,H是單應矩陣。我們計算:
A = K-1 * H
令A1,A2,A3是A和R1,R2的列向量,R3旋轉矩陣R.
r1 = a1/||a1||
r2 = a2/||a2||
r3 = r1 x r2
t = a3/sqrt(||a1||*||a2||)
問題的列向量是這樣做在大多數情況下不起作用。爲了檢查我的結果,我將R和t與OpenCV的solvePnP方法(使用以下3D點[0,0,0] [0,1,0] [1,0,0] [1,1 ,0])。
由於我以同樣的方式顯示立方體,我注意到在每種情況下solvePnP都提供了正確的結果,而從單應性得到的姿勢大多是錯誤的。
從理論上講,因爲我的觀點是共面的,它可以計算從單應的姿勢,但我找不到計算姿勢從H.
什麼我做錯了任何見解的正確方法?試圖@ Jav_Rock的方法
Jav_Rock喜後
編輯,非常感謝您的回答,我想你的方法(和其他許多人)這似乎是或多或少確定。 不過,我在計算基於4個共麪點的姿勢時仍然碰到一些問題。爲了檢查結果,我將其與solvePnP的結果進行比較(由於迭代重投影誤差最小化方法,結果會更好)。
下面是一個例子:
- 黃色立方體:解決PNP
- 黑色立方體:Jav_Rock的技術
- 青色(紫色)立方體(S):其他一些技術給完全相同的結果
正如你所看到的,黑色立方體更多或雖然這些向量似乎是正常的,但還不算好,但看起來似乎不太合適。
編輯2:我計算後對其進行了歸一化(爲了強制正交),它似乎也解決了一些問題。
所以OpenCV中的solvepnp提供正確的結果,而你的實現是錯誤的? – nav
是的solvePnP給出了正確的結果,而我只使用單應性的實現不能給出正確的旋轉/平移向量。 – JimN
如果你分享你的代碼,我們可以通過它,看看它是如何修復的。你可能忘記的一件事是強制旋轉矩陣的正交性。 – fireant