OpenCV 立體視覺詳細解析(二)---視覺深度測量
先給出求視覺深度的演算法流程圖:
攝像頭標定:
攝像機標定的過程得出攝像機幾何模型,給出透鏡的畸變模型,這兩個模型定義了攝像機的內參數模型。
攝像機幾何模型:
針孔模型:
(Learning Opencv中的此環節各種名詞的定義很混亂,在下面做一個統一)
成像平面:針孔平面。
影象平面:投影平面。
光軸:穿過針孔,與針孔平面垂直的直線。
焦距:針孔到影象平面距離。
針孔:投影中心。
主點:光軸與影象平面的焦點。
Z:針孔到物體的距離。
成像儀的中心:晶片感光陣列的中心點,圖片的畫素中心點。
由三角形相似
這個公式顯示的影象是倒立的,為了便於計算,將針孔模型轉化為計算模型,具體做法是交換影象平面與成像平面。
計算模型
若光軸與成像儀的交點剛好是影象平面的主點。那麼得到的公式是:
但是這種情況在實際中幾乎是不可能的。因此引入兩個新的引數Cx,Cy,對可能的偏移進行建模。
最終得到的公式是:
方法1:Learning Opencv的第11章
利用函式cvCalibrateCamera2()
方法2:Learning Opencv的第12章
利用函式cvStereoRectify();
求視覺深度,首先必須得看懂這個圖
Cxleft和Cxright:像平面的像主點
Ol,Or:投影中心,針孔模型中的針孔。
T:投影中心間距
f:兩個攝像頭的焦距
d:兩幅影象的視差
由三角形相似
由該公式可以看出,將求視覺深度轉化為求兩幅影象的視差。
然而在實際情況中,兩個攝像頭不可能嚴格地向前平行對準,當攝像頭不向前平行對準時,會出現一個新的感興趣點,稱之為極點。(el,er)。
實際點P與兩個極點構成的面,稱為極面。
實際點P在投影面上的投影點稱為,投影點,投影點與極點的連線稱為極線。
該圖呈現的便是立體成像的基本幾何學:對極幾何。
每一個物理世界的3D點,都對應一個極面,兩條極線。由對極幾何的定義可知,pl的匹配檢視pr,一定在對應的極線上。於是便可以將二維收索轉化為在沿著極線的一維搜尋。
對極幾何的意義在於,減少特徵匹配的計算量,並且排除虛假匹配的點。
立體標定:計算空間上兩臺攝像機幾何關係的過程。
立體校正:對個體影象進行糾正的過程。
如何計算極線?
計算極線需要知道兩個攝像機的物理相對關係和畫素相對關係,需要用到兩個矩陣
基礎矩陣和本徵矩陣的對應關係
基礎矩陣的計算:cvFindamentalmat();也可以通過cvStereoCalibrate()函式得來。
由基礎矩陣計算極線。
cvComputeCorrespondEpilines();
根據得到的極線來立體校正影象。
立體匹配,匹配兩個不同攝像機檢視的3D點,計算視差。
使用cvPerspectiveTransform()或者成vReprojectImageTo3D();得到視覺深度。
Opencv開啟指定攝像頭