[英]Initial camera intrinsic and extrinsic matrix and 3D point coordinates for Bundle Adjustment
[英]stereo vision 3d point calculation with known intrinsic and extrinsic matrix
術語“基准”通常僅表示翻譯。 由於您已經有了旋轉,平移和內在矩陣(因此請不要使用R, T
和K
)。 您可以進行三角測量,不需要基本矩陣或基本矩陣(它們可以用於提取R, T
等,但您已經有了它們)。 您實際上也不需要校正圖像,因為它不會對三角測量過程造成太大的改變。 有許多種三角測量的方法,每種都有其優缺點,並且有許多實現它們的庫。 因此,我在這里所做的只是為您提供有關問題和潛在解決方案的概述,以及指向資源的指針,您可以直接使用這些資源,也可以將其用作編寫自己的代碼的靈感之源。
形式化和解決方案概述。 讓我們將這里的內容正式化。 您有一個3d點X
,左右圖像分別具有兩個觀測值x_1
和x_2
。 如果對它們進行背投,則會獲得兩條光線:
ray_1=K^{1}x_1 rat_2=R*K^{-1}x_2+T //I'm assuming that [R|T] is the pose of the second camera expressed in the referential of the first camera
理想情況下,您希望這兩條光線在X
點相遇。 由於在實踐中我們總是有一些噪聲(離散噪聲,舍入誤差等),因此兩條光線不會在X
相遇,因此最佳答案將是點Q
,使得
Q=argmin_X {d(X,ray_1)^2+d(X,ray_2)^2}
其中d(.)
表示線與點之間的歐幾里得距離。 您可以將此問題作為常規的最小二乘問題解決,或者可以采用考慮與ray_1
和ray_2
垂直的線段l
的幾何方法(稱為midpoint ),並將其中間作為解決方案。 另一種快速而骯臟的方法是使用DLT。 基本上,您將約束( 即 X
應該盡可能靠近兩條光線)重寫為線性系統AX=0
,然后用SVD求解。
通常,幾何(中點)方法不太精確。 基於DLT的數字雖然不是最穩定的數字,但通常會產生可接受的結果。
深入形式化的資源
當然是哈特利·齊瑟曼的書! 第312頁介紹了一種簡單的基於DLT的方法,該方法在opencv中使用(在校准和sfm模塊中都使用)。該方法非常容易實現,在任何情況下都不應花費超過10分鍾語言。
塞利斯基的書。 它在SFM一章中對三角剖分進行了有趣的討論,但沒有Hartley-Zisserman的直截了當或深入。
碼。 您可以從opencv使用calib3d模塊或contribs / sfm模塊中的三角剖分方法。 兩者都使用DLT,但是來自SFM模塊的代碼更容易理解(calib3d代碼具有很多老式的C代碼,閱讀起來並不愉快)。 還有另一個庫,稱為openGV,它具有一些有趣的三角剖分方法。
CV :: SFM :: triangulatePoints
openGV git repo似乎不太活躍,我也不喜歡該庫的設計,但是如果我沒記錯的話(可以告訴我),它提供了除三角剖分之外的其他方法。
自然地,這些都是用C ++編寫的,但是,如果您使用其他語言,查找包裝器或類似的庫將不會很困難(使用python時,您仍然具有opencv包裝器,而MATLAB具有bundle模塊等)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.