双摄与双目视觉
越來越多的手機開始上雙攝,首先解釋一下雙攝的目的,雙攝可以達到什么樣的效果。首先雙攝可以分為兩類,一類是利用雙攝獲得圖像中物體到鏡頭或者焦距的距離,得到景深信息就可以進行后續的3D重建、圖像分割、背景虛化等;一類是利用兩個攝像頭所成的不同圖像進行圖像融合,獲得更多的細節信息,包括RGB鏡頭和Mono黑白攝像頭獲得圖像的融合,黑白攝像頭可以捕捉更多的細節,即解析力更高;還有廣角攝像頭和長焦攝像頭所獲圖像的融合和不同曝光參數的攝像頭實現的HDR效果。第一類中為了通過三角定位原理實現景深信息的獲得,兩個攝像頭的物理距離要盡可能大,而在第二類中為了圖像融合,兩幅或者多幅圖像需要進行對準,所以需要兩個攝像頭盡可能重疊。所以這里有一個需要平衡的點,當然,還是要算法盡可能好。需要說明的是,景深的獲得可以通過深度相機主動發射和捕捉射線來直接實現距離的計算。IPhone X就前置了結構光深度相機,采用了偽隨機散斑。此外還有飛行時間深度方案(Time of Fly,TOF),可以繞開結構光的專利問題。這篇先來理解傳統的基于小孔成像的三角定位(triangulation)。
立體視覺(stereo vision)狹義上指的就是從兩個或者多個攝像頭中獲得圖像的深度信息。它和雙目立體視覺和稠密立體算法密切相關。現在研究的重點是實現實時性。
先來看單攝像頭的情況。在攝像頭軸線的延長線上的多個點所成的像是重合的,所以無法區分它們。這也是造成一些視覺混淆現象的原因,比如下圖的哪一棟樓在前面,具體原因可能還有不同人眼的感知不同波長的錐體的分布不同,而分布不同的原因可能又是不同作息規律對錐體的訓練情況不同造成的。
再看一下雙攝像頭下的成像。
在雙攝像頭下,總會存在一個攝像頭中會由于距離的原因產生差異。先拋去三角定位原理,這里的關鍵就是如何在兩幅圖像中計算得到p(q)對應的p’、q’。這里首先要介紹一下極線約束(epipolar constraint)。
曲線L上A、B兩點的切線相交于點P,那么P就是極點,直線AB稱為極點(Epipole)P的極線。極線約束是一種點對直線的約束,而不是點與點的約束,盡管如此,極線約束給出了對應點重要的約束條件,它將對應點匹配從整幅圖像尋找壓縮到在一條直線上尋找對應點。直接在兩個攝像頭所成圖像中當然可以通過SIFT特征點等尋找匹配對,但是通過極線約束我們將搜索范圍從滑窗的大小縮小到一條直線的范圍,對于參考圖中的點p,通過極線約束,我們可以找到實際物體P、Q在Target圖中的位置所在的直線。
由上圖,紅色線上的P、Q及其延長線上的點都會被投影在Target T中的綠色線上。在下圖中,X、X1、X2、X3在左攝像頭中都重疊為同一點,而在右攝像頭的視角中,表現為幾點共線。
OL和OR是我們模仿小孔成像的小孔,或者理解為相機中的透鏡所在的位置。所成的像應該在其后方,且是倒立的像,但為了方面,我們取小孔之前的正立像作為生成的圖像,它與實際的倒像呈翻轉和縮放的關系。我理解的對極約束的物理意義是獲得分別獲得兩個攝像頭相對于另外一個的位置。所以兩個極點eL和eR。eL是OR在OL下的投影,eR是OL在OR下的投影。這樣,左攝像頭就知道了右攝像頭的位置,右攝像頭也知道了左攝像頭的位置,這樣就獲得了先驗知識,有利于對應點的查找和匹配。X、OL、OR三點確定一個平面,這就是epipolar plane極面,即目的物體位置,兩個透鏡中心確定了極面,這個極面是可變的(極面與透鏡中心,目標物體中心有關,極點只與兩個鏡頭位置有關)。對每一個確定的極面,極線就是極面與成像的交線,分別是通過另一個透鏡中心的直線在本透鏡下的投影。極點和極線是曲線上點和該點的切線的一般化,而三維空間中的極點極線又是對曲線情況的一般化,所以不太好理解,只能通過投影的方法解釋。
這里的圖示,尤其是左攝像頭的圖示,只是表示了幾個物體的相對位置的重疊遮擋情況。即便不同物體的中心與透鏡中心成一條直線,更遠的物體往往只有一部分會被前面的物體遮擋。這里成像模型簡化為小孔成像,物體也簡化成質點,而實際上鏡頭和物體都是有大小的,實際情況中往往不是因為投影重疊造成無法判斷距離遠近,實際即便是單攝像頭中遠近不同的物體也會有不同的成像表現,只不過單攝像頭下這種不同差異可能很小,需要依靠個人經驗判斷甚至難以判斷,而且更是無法獲得精確的距離大小。
在數學上,我們需要描述左攝像頭獲得圖像中的點和另一幅圖像中的極線,這樣像素點在右攝像頭圖像中的對應點一定在這一條直線上(搜索范圍可以從2D縮小到1D)。這就涉及到兩個矩陣:對極矩陣(Epipolar Matrix)/本質(本征矩陣Essential Matrix)和基本矩陣(Fundamental Matrix)。
本征矩陣描述的是兩個相機坐標系之間的關系(旋轉R和平移T)。Pl是物體P在Ol相機坐標系中的坐標,Pr是物體P在Or相機坐標系下的坐標。注意,是物體的坐標,而不是圖像中像素的坐標。
R是正交矩陣,所以
因為三向量共面,?
所以,本征矩陣E=RS
因為?,所以本征矩陣只和外參R和T有關,且S的秩rank=2。
本征矩陣只包含了兩個攝像頭的相對位置。對于具體的圖像,不僅與小孔/透鏡的位置有關,還與透鏡的焦距等有關。透鏡的焦距等屬于相機的內參。不同相機的內參不同,而且還可能是未知的。我們現在要做的是得到兩幅圖中對應點的像素的關系。首先可以由目標物體的坐標分別得到其在兩幅圖像中的坐標。左右兩幅圖分別有各自的圖像坐標系,其關系是偏移量為攝像頭的間距Tx(這里考慮的是最簡單的攝像頭排列情況,更復雜的關系要靠上文提到的本征矩陣來表示)。目標物體的三維坐標同樣以左圖的原點為原點。
xl-xr可得黃色框中Z的表達式。這樣就可以得到目標物體到baseline的距離Z。d表示的是兩幅圖像中的對應點在各自坐標系中的坐標之差xl-xr。f表示鏡頭的焦距。depth也可以由下圖由相似三角形直接得到。需要注意的是綠色的baseline長度是b,且兩幅圖像(粉色線段)之間的關系也是進行了長度為b的平移。
在本征矩陣中得到了物體在兩個鏡頭坐標系下的坐標的關系,由上圖中求圖像坐標的表達式也可以得到兩幅圖中對應點的坐標的關系。也是三個元素的點乘等于0.為了將坐標離散化,將坐標的絕對長度轉換成像素點的個數,這才引入了基礎矩陣。基礎矩陣不僅依賴于兩個攝像頭之間的平移和旋轉量,還依賴于相機的內部參數。
到這里,我們就可以由左圖中像素點的坐標得到其在另外一幅圖中對應點的約束直線方程。而且通過SVD分解可得極點。
注:
這里的雙目視覺是被動的測量,知乎日報的一篇文章講解了Iphone是如何利用結構光實現了人臉的識別,實現了點與點的配對。
Reference:
1.http://vision.deis.unibo.it/~smatt/FBS_GPU.html
2.http://vision.deis.unibo.it/~smatt/Seminars/StereoVision.pdf
3.https://www.cnblogs.com/houkai/p/6661607.html
4.https://zhuanlan.zhihu.com/p/37802103
5.https://blog.csdn.net/lin453701006/article/details/55096777
6.https://blog.csdn.net/KYJL888/article/details/81566961
7.https://www.cnblogs.com/houkai/p/6661607.html
8.http://www.robots.ox.ac.uk/~vgg/hzbook/hzbook2/HZepipolar.pdf
總結
- 上一篇: Redis是单线程为什么还那么快?
- 下一篇: 单片机实验-定时中断