立體視覺(Stereo Vision)是計算機視覺技術的一個重要模塊。當看到一個物體的時候,人類的視覺系統不僅可以識別出這個物體是什么,而且還能估計出這個物體是離我們比較近還是比較遠的。那我們賦予機器人視覺系統時,除了能夠識別物體外,同樣的要能夠判斷出障礙物距離有多遠。人類時靠雙眼來估計距離的,因此一句話總結以下立體視覺:立體視覺是一種計算機視覺技術,其目的是從兩幅或兩幅以上的圖像中推理出圖像中每個像素點的深度信息。(這里的深度指物體距離相機的距離)
1. 立體視覺原理
立體視覺借鑒了人類雙眼的“視差”原理,即左、右眼對於真實世界中某一物體的觀測是存在差異的, 我們的大腦正是利用了左、右眼的差異,使得我們能夠辨識物體的遠近。因此如人類雙眼一樣,立體視覺系統需要有兩個(或者兩個以上)攝像頭的支持。
1.1 單目系統
單目系統中只有一個相機,如下圖所示,O點為相機的光心,π是攝像頭的成像平面(注意:實際的成像平面在相機光心的后面,這里畫在光心和物體之間方便展示和理解,一般這個稱為虛擬成像平面)。
從圖中可以看出,如果P點與Q點在同一條直線上,那么他們在圖像上的成像點就是同一個點,也就是\(p=q\) ,那么也就看不出來他們在距離上的差異(也就無法知道Q在前還是P在前)
1.2 雙目系統
為了改善單目系統的上述缺陷,雙目系統中存在兩個相機,從而形成一個立體系統,如下圖所示。兩個相機拍攝同一場景,如果我們可以從拍攝出的兩幅圖像中找到對應點,就可以模擬人眼的視差原理計算出物體的深度(距離)。
從圖中可以很明顯的看出,在增加了一個攝像頭之后,P與Q在目標面T上的成像不在位於同一個點,而是有自己分別的成像點,也就是\(p^{'}\)和\(q^{'}\) 。
1.3 視差和深度計算原理
有了上述的雙目系統后,接下來就是通過參考面和目標面計算深度。先看下雙目系統中的一些定義,下圖中\(O_1 , O_2\)是兩個相機的光心,\(I_1\),\(I_2\)是對應的成像平面,\(p_1\),\(p_2\)是物體P在兩個相機中的成像點,有下面一些常見定義:
- 極平面:\(O_1 , O_2 , P\)三個點確定的平面;
- 極點:\(O_1O_2\)連線與像平面\(I_1\),\(I_2\)的交點\(e_1、e_2\);
- 基線(baseline):\(O_1O_2\)
- 極線:極平面與兩個像平面之間的交線\(l_1、l_2\)。
簡化上面的雙目系統,確保兩個攝像頭的參數是完全一致的,並且兩者的位置是平行,讓兩個成像平面保持水平,如下圖所示,我們假設 \(P\)為空間中的一點,\(O_R\)為左邊攝像頭的光心,\(O_T\)為右邊攝像頭的光心,攝像頭的焦距為\(f\)(光心到成像平面的距離),成像平面在圖中用粉色線表示, \(O_RO_T\)表示兩個攝像頭光心之間的距離,也稱為基線,\(P\)在左右兩個攝像機成像平面上的成像點分別為\(p\)與\(p^{'}\) , \(X_R\)與 \(X_T\)為成像點的水平方向的距離(通常我們得到的是像素坐標系下的 \(x\)坐標,其單位為像素,因此需要轉換為實際的物理長度,涉及到坐標系的轉換問題),\(Z\)就是我們需要求的深度。
從上圖中可以找到一組相似三角形\(\triangle Ppp^{'}\sim \triangle PQ_RQ_T\),根據三角形相似定理,可以得到:
求解得到:
上式中的D就是我們通常所說的視差(disparity ),即同一個物體在兩幅圖像上的像素值差異。(注意:上述表達式中B,f的值為物理單位,D的值為像素單位,實際計算時要將像素單位轉化為物理單位后再計算)
關於上面公式的推導,由兩點值得說明下:
1. 兩個相平面不平行怎么辦?
上面推導中我們假設了兩個平行的相平面,這是由於雙目系統實際安裝時都會進行校准,保證兩個相機參數完全一致,讓相平面盡量平行。如果的確相平面不平行,根據相機轉動角度,是可以得到這個傾斜角的,根據角度將傾斜相平面投影到水平,再進行計算
2. 實際相平面在光心后面,不是前面,有影響嗎?
關於相機模型中的相平面,參考之前文章https://www.cnblogs.com/silence-cho/p/15023822.html
上述推導中,我們采用了虛擬相平面(光心和成像物體之間的),而實際的相平面是在光心后面的,這個有影響嗎?開始我也有這個疑問,后來進行畫圖推導后,發現最終結果是一樣的,只是上面相識三角形的等式會變成下面的形式:
求解結果相同:\(Z =\frac{B*f}{X_R-X_T} = \frac{B*f}{D}\)
1.4 視差圖(Disparity Map)
上面計算深度的公式中,最終要的就是視差這個概念。一般,將同一空間物理點在不同圖像中的映像點對應起來,這個差別,我們稱作視差。很多視差點組成的圖像稱為視差圖(Disparity Map)。
另外,通過視差計算深度的表達式,可以發現深度和視差成反比,即視差越大,則物體離相機越近,視差越小,物體離相機越遠,如下圖所示:
下面是一個視差圖示例,第一幅圖和第二幅圖分別是雙目相機得到的左圖和右圖,第三幅圖就是視差圖。可以很明顯的看出來越亮的地方表示視差越大,也就離相機越近,反之離相機也就越遠。