我在視頻(或圖像)中有4個共面點,代表一個四邊形(不一定是正方形或矩形),我希望能夠在它們的上方顯示一個虛擬立方體,立方體的角恰好位于這些角上視頻四分之一。由于這些點是共面的,因此我可以計算單位正方形的角(即[0,0] [0,1] [1,0] [1,1])與四邊形的視頻坐標之間的單應性。通過這種單應性,我應該能夠計算出正確的攝像機姿勢,即[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 r2t = 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的技術青色(和紫色)多維數據集:其他一些技術得出的結果完全相同如您所見,盡管矢量看起來是正交的,但黑色立方體或多或少是可以的,但似乎比例不高。EDIT2:我對v3進行了歸一化(為了增強正交性),它似乎也解決了一些問題。
3 回答

哆啦的時光機
TA貢獻1779條經驗 獲得超6個贊
萬一有人需要@Jav_Rock編寫的函數的python移植:
def cameraPoseFromHomography(H):
H1 = H[:, 0]
H2 = H[:, 1]
H3 = np.cross(H1, H2)
norm1 = np.linalg.norm(H1)
norm2 = np.linalg.norm(H2)
tnorm = (norm1 + norm2) / 2.0;
T = H[:, 2] / tnorm
return np.mat([H1, H2, H3, T])
在我的任務中工作正常。
- 3 回答
- 0 關注
- 1840 瀏覽
添加回答
舉報
0/150
提交
取消