簡體   English   中英

具有已知內在和外在矩陣的立體視覺3d點計算

[英]stereo vision 3d point calculation with known intrinsic and extrinsic matrix

我已經使用兩個攝像機的固有攝像機矩陣成功計算了“旋轉”,“平移”。 我還從左右攝像機獲得了校正后的圖像。 現在,我想知道如何計算一個點的3D坐標,即圖像中的一個點。 在這里,請參閱綠點。 我看了方程式,但是它需要基線,我不知道該如何計算。 您能告訴我使用給定信息(R,T和本征矩陣)計算綠點的3d坐標的過程嗎?

僅供參考1.我也有一個基本矩陣和基本矩陣,以防萬一我們需要它們。 2.原始圖像尺寸為960 x720。校正后的尺寸為925 x 669 3.左側圖像的綠點:(562,185),右側圖像的綠點:(542,185)

在此處輸入圖片說明

術語“基准”通常僅表示翻譯。 由於您已經有了旋轉,平移和內在矩陣(因此請不要使用R, TK )。 您可以進行三角測量,不需要基本矩陣或基本矩陣(它們可以用於提取R, T等,但您已經有了它們)。 您實際上也不需要校正圖像,因為它不會對三角測量過程造成太大的改變。 有許多種三角測量的方法,每種都有其優缺點,並且有許多實現它們的庫。 因此,我在這里所做的只是為您提供有關問題和潛在解決方案的概述,以及指向資源的指針,您可以直接使用這些資源,也可以將其用作編寫自己的代碼的靈感之源。

  • 形式化和解決方案概述。 讓我們將這里的內容正式化。 您有一個3d點X ,左右圖像分別具有兩個觀測值x_1x_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_1ray_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 :: triangulatePoints

    CV :: SFM :: triangulatePoints

    OpenGV

    openGV git repo似乎不太活躍,我也不喜歡該庫的設計,但是如果我沒記錯的話(可以告訴我),它提供了除三角剖分之外的其他方法。

    自然地,這些都是用C ++編寫的,但是,如果您使用其他語言,查找包裝器或類似的庫將不會很困難(使用python時,您仍然具有opencv包裝器,而MATLAB具有bundle模塊等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM