
本文將使用OpenCV和立體視覺來賦予計算機這種深度知覺能力。
你是否曾經好奇過,為什么你帶上特制的3D眼鏡就可以體會到電影奇妙的立體效果?或者為什么閉上一只眼睛就很難抓住一個飛來的棒球?這都和立體視覺有關,它是我們利用雙眼來感知深度的能力。這篇推送將使用OpenCV和立體視覺來賦予計算機這種深度知覺能力。我們將提供Python和C++代碼。

上面這張動圖中,一個很厲害的地方在于,這臺計算機不僅能檢測到不同的物體,而且還能標出它們有多遠。這說明它能探測深度!在這段視頻中,我們使用了OAK-D立體相機設置(OpenCV AI Kit-Depth)(外鏈)來幫助計算機感知深度。那么,什么是立體相機設備呢?我們如何用它來幫助計算機感知深度?這和立體視覺有什么關系呢?這篇推送將通過講解對極幾何和立體視覺的基本概念來解答上述問題。本文的大多數理論解釋都來自于這本書:Multiple View Geometry in Computer Vision,作者是RichardHartley和Andrew Zisserman。這是講解計算機視覺領域很多基本概念的一本非常著名的經典教材。本文是“空間AI技術簡介系列”的第一部分,它將會提供很多基本概念的介紹,是理解本系列后續(xù)內容的基礎。當我們用一張照片來捕捉(投影)一個三維物體時,我們實際上是把它從一個三維空間投影到了一個二維(平面)投影空間。這被稱為平面投影。問題在于平面投影導致我們失去了深度信息。那么我們要如何還原深度呢?我們能僅僅用一張圖像就算出一個場景的深度嗎?讓我們來看一個簡單的例子:
圖1. 用一個三維空間中已知的點(C1)和一個方向向量(L1)來確定一個深度未知的三維空間中的點(X)在圖1中,C1和X是三維空間中的點,單位向量L1給出了從C1到X射線的方向?,F在,如果我們知道C1和單位向量L1的相關值,能夠找到X的位置嗎?從數學上來說,其實就是要解出下面等式中的X:

圖2. 用兩個三維空間中已知的點(C1和C2)以及方向向量(L1和L2)來定位三維空間中一個深度位置的點(X)——三角測量在圖2中,我們新增了一個點C2,以及一個表示從C2到X的射線方向的向量L2。如果已知C2和L2,我們可以確定一個唯一的X嗎?答案是肯定的!因為從C1和C2出發(fā)的射線顯然相交于一點,也就是X。這被稱為三角測量。也就是說,我們對點X進行了三角測量。
圖3. 針對三維空間空間的一點(X),已知兩個機位(C1和C2)和兩個像素坐標(x1和x2),用拍出這點的兩張圖像來算出這點的深度,這個方法可以借用三角測量的概念來解釋圖3展示了當一個點(X)被捕捉(投影)到兩張不同的圖像中時,如何用三角測量來計算它的深度。在這張圖中,C1和C2分別代表左、右兩個相機在三維空間中的位置,它們是已知的。x1是左相機捕捉到的三維空間中點X的圖像,而x2則是右相機捕捉到的。x1和x2被稱作對應點,因為他們是同一個三維點點投影。我們用x1和C1確定L1,用x2和C2確定L2。這樣我們就可以像圖2那樣用三角測量找出X。從上面的例子中,我們知道了根據兩張不同角度的照片、用三角測量找到一個三維空間中的點,需要知道下面這些關鍵信息:注意,這只是計算一個三維點。我們如何通過兩個不同機位的圖像計算一個真實場景中的三維結構呢?一個顯然的答案是,對圖中的每一個點重復上述的過程。讓我們更仔細地看看實操中的麻煩!
圖4展示了從兩個不同角度捕捉的一個現實場景。為了計算一個三維結構,我們試著找找前面提到的兩個必要前提:1. 現實世界參考系中相機的位置(C1和C2)。為了簡化計算三維點的問題,我們假定其中一個機位(C1或C2)是初始的。我們通過一種已知的標定模式標定雙視系統來找到相機的位置,這個過程被稱為立體相機標定。2. 計算場景中的每個三維點(X)的對應點(x1和x2)。我們將討論很多優(yōu)化對應點計算的方法,最后會理解對極幾何將如何幫助我們簡化這個問題。注意:兩個相機的相對位置必須嚴格固定,只有這樣捕捉到的圖像,才能用立體相機標定處理。如果用一個相機從兩個不同的位置捕捉圖像,那么我們只能得到深度的比例。我們只能通過捕捉的場景中一些特別的幾何信息,來找到絕對的深度。
圖5展示了人工標注的對應點。我們人類很容易看出哪些點相互對應,但怎么讓計算機做到這點呢?計算機視覺領域人們常用的一種方法叫做特征匹配。圖6展示了用ORB特征標注器標出左圖和右圖之間相互匹配的特征。這是找到對應點(配對)的一種方法。
然而,我們觀察到,具有已知點對應關系的像素數量與總像素數量的比率是最小的。這意味著我們將有一個非常稀疏的三維場景的重建。對于密集的重建,我們需要盡可能獲得最大數量的像素的點對應關系。
找到點對應關系的一個簡化方法是找到具有相似相鄰像素信息的像素。在圖7中,我們觀察到,使用這種具有相似相鄰信息的像素匹配方法,會導致一個圖像中的單個像素在另一個圖像中具有多個匹配。我們發(fā)現寫一個算法來確定真正的匹配是有難度的。有什么方法可以減少我們的搜索空間嗎?我們可以用一些定理來消除所有額外的錯誤匹配,減少不正確的點對應?我們在這里利用了對極幾何學。所有這些解釋和鋪墊都是為了介紹對極幾何的概念。現在我們將理解對極幾何在減少點對應的搜索空間方面的重要性。
在圖8中,我們假設有一個與圖3類似的立體相機設備。一個三維點X被C1和C2的攝像機分別在x1和x2處捕獲。由于x1是X的投影,如果我們試圖從C1延伸出一條穿過x1的射線R1,它也應該穿過X。這條射線R1被捕獲為線L2,而X在圖像i2中被捕獲為x2。由于X位于R1上,x2應該位于L2上。這樣一來,x2的可能位置就被限制在一條線上,因此我們可以說,圖像i2中對應于像素x1的像素的搜索空間被縮小到一條線L2。我們使用對極幾何來尋找L2。現在是時候定義一些技術術語了!與X一起,我們也可以在各自的相反圖像中投射出相機中心。e2是相機中心C1在圖像i2中的投影,而e1是相機中心C2在圖像i1中的投影。e1和e2的技術術語是“對極點”(epipole)。因此,在一個雙視圖的幾何設置中,對極是一個視圖的攝像機中心在另一個視圖中的影像。連接兩個攝像機中心的線被稱為基線(baseline)。因此,對極也可以被定義為基線與圖像平面的交點。圖8顯示,使用R1和基線,我們可以定義一個平面P。這個平面也包含X、C1、X1、X2和C2。我們稱這個平面為對極平面(the epipolar plane)。此外,從對極平面和圖像平面的交點得到的線被稱為極線(the epipolar line)。因此,在我們的例子中,L2是一條極線。對于不同的X值,我們將有不同的對極平面,因此也有不同的極線。然而,所有的對極平面都相交于基線,而所有的極線都相交于對極。所有這些共同構成了對極幾何。我們有了用基線B和射線R1構成的平面P。e1和e2是對極點,L2是極線。基于所給圖像的對極幾何,在圖像i2中與像素x1相對應的像素的搜索空間被限制在一條二維線上,即極線L2。這就是所謂的極線約束。有沒有一種方法可以用一個單一的矩陣來表示整個對極幾何形狀?此外,我們能否只用兩張拍攝的圖像來計算這個矩陣?好消息是,有這樣一個矩陣,它被稱為基本矩陣(the Fundamental matrix)。在接下來的兩節(jié)中,我們首先理解投射幾何和齊次表征的含義,然后嘗試推導出基本矩陣的表達。最后,我們通過使用基本矩陣來計算極線和表征極線約束。我們如何在二維平面上表示一條直線?二維平面內直線的方程是ax + by + c = 0。隨著a、b、c值的不同,我們在二維平面內得到不同的直線。因此,可以用一個矢量(a,b,c)來表示一條直線。假設我們有直線ln1定義為2x+3y+7=0,直線ln2定義為4x+6y+14=0。根據我們上面的討論,l1可以用向量(2,3,7)表示,l2可以用向量(4,6,14)表示。我們可以很容易地說,l1和l2基本上代表了同一條線,而向量(4,6,14)基本上是向量(2,3,7)的縮放版本,縮放系數為2。因此,任何兩個矢量(a,b,c)和k(a,b,c),其中k是一個非零比例常數,代表同一條線。這樣的等價向量,只通過一個縮放常數就可以聯系起來,形成一類齊次向量。矢量(a,b,c)是其各自等價矢量類的齊次表示。由(a,b,c)代表的所有等價類的集合,對于a=b=c=0以外的所有可能的實值,構成了投影空間。我們使用齊次坐標的齊次表示法來定義投影空間中的點、線、平面等元素。我們使用投影幾何的規(guī)則來對投射空間中這些元素進行任何轉換。在圖3中,假設我們知道兩臺攝像機的投影矩陣,例如C1處的攝像機的P1和C2處的攝像機的P2。什么是投影矩陣?攝像機的投影矩陣定義了攝像機拍攝的三維世界坐標和其相應的像素坐標之間的關系。要了解更多關于相機投影矩陣的信息,請閱讀這篇關于相機校準的文章。就像P1將三維世界坐標投射到圖像坐標一樣,我們定義P1inv,即P1的偽逆,這樣我們可以定義從C1經過x1和X的射線R1為:
k是一個比例參數,因為我們不知道X與C1的實際距離。我們需要找到表極線Ln2來減少i2中對應于i1中像素x1的搜索空間,因為我們知道Ln2是i2中捕獲的射線R1的圖像。因此,為了計算Ln2,我們首先在射線R1上找到兩個點,用P2將它們投射到圖像i2中,并使用這兩個點的投影圖像來尋找Ln2。我們可以考慮的R1上的第一個點是C1,因為射線從這個點開始。第二個點可以通過保持k=0來計算。因此我們得到的點是C1和(P1inv)(x1)。使用投影矩陣P2,我們得到這些點在圖像i2中的圖像坐標分別為P2*C1和P2*P1inv*x1。我們還觀察到,P2*C1基本上是圖像i2中的外極e2。在投影幾何學中,可以用兩點p1和p2來定義一條線,只需找到它們的交積p1x p2。因此:
在投影幾何學中,如果一個點x位于一條線L上,我們可以把它寫成方程的形式

將Ln2的值從上式中替換出來,我們就得到了這個方程:
這是兩個點x1和x2成為對應點的必要條件,也是一種極線約束的形式。因此,F代表了雙視角系統的整體對極幾何形狀。由于x1和x2是方程中的對應點,如果我們能找到一些點的對應關系,使用ORB或SIFT等特征匹配方法,我們可以用它們來解決上述方程的F。OpenCV的findFundamentalMat()方法提供了各種算法的實現,如7點算法、8點算法、RANSAC算法和LMedS算法,以利用匹配的特征點計算基本矩陣。
如果我們知道Ln2,我們就可以利用極點約束來限制我們對與像素x1對應的像素x2的搜索。我們一直在嘗試解決對應問題。我們開始使用特征匹配,但我們觀察到它導致了一個稀疏的三維結構,因為總像素中只有極小部分的點對應關系是已知的。然后,我們看到我們可以使用基于模板的搜索來尋找像素的對應關系。我們學習了如何利用對極幾何學將點的對應關系的搜索空間減少到一條線——極線。我們能否進一步簡化這個尋找密集點對應關系的過程呢?
圖9. 上方的一對圖像顯示了特征匹配的結果,下方的一對圖像顯示了一幅圖像中的一個點(左)和第二幅圖像中位于各自極線上的相應點(右)

圖10. 雙視圖幾何的特殊情況。上方的一對圖像顯示了特征匹配的結果,下方的一對圖像顯示了一幅圖像中的一個點(左)和第二幅圖像中位于各自極線上的相應點(右)。(來源:2005 Stereo Dataset(外鏈))圖9和圖10顯示了兩對不同圖像的特征匹配結果和極線的約束情況。這兩張圖在特征匹配和極線方面最明顯的區(qū)別是什么?是的,你說對了!在圖10中,匹配的特征點具有相等的垂直坐標。所有對應的點都有相等的縱坐標。圖10中的所有極線都必須是平行的,并且與左圖中的相應點具有相同的垂直坐標。那么,這有什么好的?正是如此!與圖9的情況不同,不需要明確計算每條極線。如果左圖中的像素位于(x1,y1),那么第二幅圖像中相應的極線的方程就是y=y1。我們?yōu)樽髨D中的每個像素搜索其在右圖同一行中的相應像素。這是一個雙視角幾何學的特例,成像平面是平行的。因此,對極(一個相機拍攝的圖像被另一個相機捕獲)在無限遠處形成。根據我們對對極幾何的理解,極線在對極處相遇。因此,在這種情況下,由于對極在無限遠處,我們的極線是平行的。真棒!這大大簡化了密集點的對應問題。然而,我們仍然要對每個點進行三角測量。我們能不能把這個問題也簡化呢?好吧,平行成像平面的特殊情況再一次給我們帶來了好消息!它可以幫助我們應用立體視差。它類似于立體視像或立體視覺,是幫助人類感知深度的方法。讓我們詳細了解一下。下面的動圖是用Middlebury立體數據集2005(外鏈)的圖像生成的。它展示了相機的純平移運動,使成像平面平行。你能分辨出哪些物體離相機更近嗎?
我們可以清楚地說,底部的玩具牛比最上面一排的玩具更靠近相機。我們是如何做到這一點的呢?我們基本上可以看到物體在兩幅圖像中的移動。移位越多,物體就越近。這種偏移就是我們所說的視差(disparity)。我們如何利用它來避免計算深度時的三角測量?我們計算每個像素的差距(兩個圖像中像素的移動),并應用比例映射來尋找給定差距值的深度。這在圖12中得到了進一步的論證。我們將使用OpenCV的StereoSGBM方法來編寫代碼,計算給定一對圖像的視差圖。StereoSGBM方法是基于[3]的。
圖13. 左、右圖為真實世界場景的圖像和相應的真實世界場景的輸出視差圖像。(來源:2014 HighResolution Stereo Datasets [2])試著玩玩不同的參數,觀察它們如何影響最終輸出的視差圖計算。關于StereoSGBM的詳細解釋將在隨后的空間AI系列介紹中介紹。在下一篇文章中,我們將學習創(chuàng)建自己的立體相機設備并錄制實時的視差圖視頻,我們還將學習如何將視差圖轉換成深度圖。還將解釋立體相機的一個有趣應用,但這是目前的一個驚喜!參考文獻
[1] Richard Hartley and AndrewZisserman. 2003. Multiple View Geometry in Computer Vision (2nd. ed.).Cambridge University Press, USA.
[2] D. Scharstein, H. Hirschmüller, Y. Kitajima,G. Krathwohl, N. Nesic, X. Wang, and P. Westling. High-resolution stereodatasets with subpixel-accurate ground truth. In German Conference on PatternRecognition (GCPR 2014), Münster, Germany, September 2014.
[3] H. Hirschmuller, “Stereo Processingby Semiglobal Matching and Mutual Information,” in IEEE Transactions on PatternAnalysis and Machine Intelligence, vol. 30, no. 2, pp. 328-341, Feb. 2008, doi:10.1109/TPAMI.2007.1166.
原文標題:
Introductionto Epipolar Geometry and Stereo Vision
獨家|OpenCV?1.1 Mat?- 基本圖像容器(附鏈接)
獨家|OpenCV?1.3 矩陣的掩膜操作(附鏈接)
獨家|OpenCV?1.5 利用OpenCV疊加(混合)兩幅圖像
獨家|OpenCV 1.6 改變圖像的對比度和亮度!
獨家|OpenCV?1.7 離散傅里葉變換
獨家|OpenCV 1.8 使用XML和YAML文件實現文件的輸入/輸出
獨家|OpenCV 1.9 如何利用OpenCV的parallel_for_并行化代碼(附代碼)
獨家|OpenCV 1.10 使用OpenCV實現攝像頭標定
編輯:王菁
黃瑞迪,清華大學外國語言學及應用語言學碩士在讀,本科畢業(yè)于清華大學外國語言文學系。對兒童如何利用環(huán)境中的數據迅速學會自己的母語非常感興趣,同時也希望從紛繁復雜的數據中把握住關鍵點,讓為信息所困的自己和人們不再迷茫。
工作內容:需要一顆細致的心,將選取好的外文文章翻譯成流暢的中文。如果你是數據科學/統計學/計算機類的留學生,或在海外從事相關工作,或對自己外語水平有信心的朋友歡迎加入翻譯小組。
你能得到:定期的翻譯培訓提高志愿者的翻譯水平,提高對于數據科學前沿的認知,海外的朋友可以和國內技術應用發(fā)展保持聯系,THU數據派產學研的背景為志愿者帶來好的發(fā)展機遇。
其他福利:來自于名企的數據科學工作者,北大清華以及海外等名校學生他們都將成為你在翻譯小組的伙伴。
點擊文末“閱讀原文”加入數據派團隊~
轉載須知
如需轉載,請在開篇顯著位置注明作者和出處(轉自:數據派ID:DatapiTHU),并在文章結尾放置數據派醒目二維碼。有原創(chuàng)標識文章,請發(fā)送【文章名稱-待授權公眾號名稱及ID】至聯系郵箱,申請白名單授權并按要求編輯。
發(fā)布后請將鏈接反饋至聯系郵箱(見下方)。未經許可的轉載以及改編者,我們將依法追究其法律責任。