7

我讀的功能solvePnP()的源代碼在OpenCV中,當flags PARAM使用默認值SOLVEPNP_ITERATIVE,它調用cvFindExtrinsicCameraParams2,其中首先使用DLT算法(如果我們有3D點的非平面集)來初始化6DOF相機姿態,並且SECOND使用CvLevMarq solver來最小化重投影誤差。爲什麼直接線性變換(DLT)不能給出最佳的相機extrinsics?

我的問題是:DLT將問題描述爲線性最小二乘問題並用SVD分解來解決問題,這似乎是一個最優解,爲什麼我們仍然使用Lev-Marq迭代方法?

或者,DLT算法的問題/侷限性是什麼?爲什麼封閉形式的解決方案導致成本函數的最小值爲LOCAL

+0

我認爲通常會對迭代地完成外部估計的某種非線性細化添加額外的步驟。看到這裏:http://www.epixea.com/research/multi-view-coding-thesisse9.html – Dan

+0

@Dan thx爲您的鏈接,我知道這是常見的,就像'CvLevMarq'求解器在opencv中做的一樣。我的意思是,DLT似乎是一種**成本函數的閉形式最小化**,爲什麼它仍然較差(局部最小值)? – zhangxaochen

回答

4

當你想找到問題的解決方案時,第一步是用數學術語表達這個問題,然後你可以使用現有的數學工具找到你的方程的解決方案。然而,有趣的問題通常可以用許多不同的數學方法來表達,每種方法都可能導致稍微不同的解決方案。然後需要分析不同的方法來了解哪個方法提供了最穩定/準確/高效的解決方案。

在PnP問題的情況下,我們希望找到給定三維點與其投影圖像平面之間關聯的相機姿態。

在數學上表達這個問題的第一種方法是把它作爲線性最小二乘問題。這種方法被稱爲DLT方法,它很有趣,因爲線性最小二乘法有一個封閉形式的解決方案,可以使用奇異值分解來穩健地找到解決方案。但是,這種方法假設攝像機姿態P有12個自由度,但實際上只有6個(3D旋轉爲3,3D平移爲3)。爲了從這種方法的結果中獲得6DOF相機姿態,需要近似值(DLT的線性成本函數未涵蓋),導致不準確的解決方案。

數學表達PnP問題的第二種方法是使用幾何誤差作爲成本函數,並找到最小化幾何誤差的相機姿態。由於幾何誤差是非線性的,因此該方法使用迭代求解器(例如Levenberg Marquardt算法)估算解。這種算法可以考慮相機姿態的6個自由度,從而產生精確的解決方案。但是,由於它們是迭代方法,因此需要提供解決方案的初始估計,實際上這通常是使用DLT方法獲得的。

現在回答你的問題的標題:當然,DLT算法給出了最佳的相機外部因素,但它僅在DLT算法求解的線性成本函數的意義上是最優的。多年來,科學家發現更復雜的成本函數可以帶來更準確的解決方案,但也更難以解決。

+0

Thx首先〜你的意思是DLT比較差,因爲它得到的12DOF矩陣不完全是一個剛性變換矩陣?但是,據我所知,運算svd(H)= UWV^T'然後'result = VU^T'確實給出了具有3DOF而非9DOF的精確旋轉矩陣(具有det = + 1的正交矩陣)不是它? – zhangxaochen

+1

是的,有一些方法可以從12DOF中提取6DOF相機姿態(如使用SVD,就像你說的那樣)。然而,這種變換沒有被DLT算法的線性最小二乘問題所覆蓋,因此您最終得到的6DOF相機姿態在線性最小二乘成本函數的意義上不再是最優的。爲了在最小二乘問題中嵌入6DOF姿態估計,需要一個非線性函數,我們知道最小化非線性函數的最好方法是通過迭代求解器(例如Levenberg-Marquardt算法)。 – AldurDisciple

相關問題