影象處理中消除相機透鏡畸變和視角變換
三維座標點經過透視投影變換,轉換到一個影象平面座標點。
而相機透鏡還存在一定的畸變,包括橫向畸變和切向畸變。
因此,針孔相機模型又被擴充套件為以下模型:
首先,世界座標被轉換為相機座標,由X,Y,Z到x,y,z;
然後,歸一化,z=1處,x,y的投影座標x`,y`;
接下來,對投影座標,進行畸變處理;
最後,由相機座標轉換到影象座標。
在使用廣角鏡頭或魚眼相機時,原始影象存在畸變比較嚴重。
在影象識別的很多應用場景中,消除影象的畸變是影象預處理的首要問題。
通過相機標定,很容易拿到相機的內部引數,包括焦距、光心和畸變係數。
以上過程,就是透鏡畸變前後影象座標變換的公式。具體步驟如下:
1. 由影象座標系反變換到相機座標系中
2. 然後,校正反變換R-1,一般無校正變換的相機,預設為單位矩陣
3. 歸一化,並進行相機透鏡畸變處理
4. 由相機座標轉換到影象座標。
由此,得到由針孔模型到透鏡畸變畸變模型相互變換的對應關係u <--> mapx, v <--> mapy
initUndistortRectifyMap函式就是完成了以上工作。
opencv中,remap與undistortion都是消除畸變的函式,undistortion在設定了一些引數後呼叫了remap函式,二者的演算法實質是一樣的。由目標影象的座標,找到對應的原始影象座標,然後將其值複製到目標影象。大致思路是如此,由於影象大小和變換,需要插值或近似的方法,如最鄰近法、線性插值等
影象視角變換
如影象由前向視角frontview轉換為俯視角birdview。
一般來講,相機向下傾斜時,相機前向視角frontview的視角範圍比較大,而俯視birdview需要的視角比較小(涉及地面的視角部分)。
針孔模型下,在前向視角影象中,擷取涉及地面的部分,並通過透視變換,轉換為俯視視角。地面的一個矩形區域,在前向檢視中會大致是一個三角形或梯形的形狀,而在俯檢視中,仍是一個矩形影象,且能保留線性、平行性特徵。
如下,一個前向廣角檢視,轉換為俯檢視。
前向檢視:
俯檢視:
轉換方法:
首先,通過標定獲取相機的外部引數,世界座標系中相機的位置Position和傾角(相對於x,y,z座標軸的角度),即M=R|t。並假定地面的z座標為z=0.
然後,獲取俯檢視內的三維地面座標。z=0,地面區域的實際大小與俯檢視的大小成一定比例,即俯檢視中一個畫素的位置(u`,v`),在地面座標上,也有對應的位置(x`, y`, 0) = (u`*spaceSolution, v`*spaceSolution, 0).spaceSolution是空間畫素的大小,如一個畫素的高和寬是0.05米。。
然後,由上面第二塊公式,通過位置變換,畸變計算,和相機引數變換,三個步驟,將每個地面位置座標(x`,y`, 0)轉換為前向檢視中的座標(u, v)。
此時,前向畸變檢視像與俯檢視像有一個對應關係(u,v) <--> (u`,v`)。
雙目相機的畸變校正以及平行校正(極線校正)的入門問題總結
| 標籤: 相機標定,極線校正,畸變校正,座標系轉換 | 作者: wangxiaokun671903 相關 | 釋出日期 : 2014-08-21 | 熱度 : 1226° 做相機標定對於剛入手的人來說有很多疑惑的點,我總結個人的入手的方法和需要弄明白的問題:
一、相機標定是幹什麼的,需要什麼器材才能做?雙目校正目標是什麼,又需要什麼裝置?
二、相機(針孔)模型是什麼樣的?世界座標系,相機座標系,影象物理座標系,影象畫素座標系,這四個座標系到底是什麼?從世界座標系到影象座標系到底是怎麼轉換的?
三、Opencv中用到的相機標定函式,對應的演算法具體是誰的,什麼演算法?獲得的各矩陣資料的含義指的是什麼?
四、獲得單個相機的內參矩陣和畸變係數後,怎麼對相機進行畸變校正?
五、分別獲得兩個相機的內參矩陣和畸變係數,以及兩相機之間的相對旋轉平移矩陣後。怎樣進行雙目平行校正?校正的結果和流程應該是怎樣的?
這些問題如果搞清楚了,那麼相機的畸變和平行校正的方法你一定也就明白了。
對於上述問題,我目前的理解如下:
一、相機標定就是要通過一定的方法對特定影象(棋盤格角點檢測)計算出這個相機本身的一些引數,包擴:內參矩陣A,外參矩陣[R|T]、畸變係數[k1,k2,k3,~,p1,p2,~]。內參矩陣各元素意義:一個畫素的物理尺寸dx和dy,焦距f,影象物理座標的扭曲因子gama,影象原點的縱橫偏移量cx和cy。外參矩陣:世界座標系轉換到相機座標系的旋轉R和平移T矩陣。畸變係數:包括相機的徑向畸變係數k1,k2,k3,~和相機的切向畸變係數p1,p2,~。需要的器材:一個黑白棋盤格的標定板,一個相機拍攝的不同角度或距離的棋盤格影象至少三張以上。
雙目校正就是通過一定的方法將兩個攝像頭拍攝同一個物體的影象進行處理,使得兩幅影象最終達到下面的目標,同一個物體在兩幅影象中的大小一樣,且水平在一條直線上。需要的裝置:雙目攝像頭(即兩個同規格的攝像頭水平放置左右攝像頭),拍攝同一個物理的左右影象對,需要已知左右相機的內參矩陣、畸變係數、右相機相對於左相機的旋轉矩陣R(通過一定的方法可將此矩陣分解成兩個矩陣R1和R2,即左右相機各旋轉一半達到水平)。
二、針孔相機的模型:三維世界中的物體,經過相機成像系統,變成二維影象過程如下所示。
世界座標系:就是物體在真實世界中的座標,比如黑白棋盤格的世界座標系定在第一個棋盤格的頂點,Zw就是垂直於棋盤格的方向。可見世界座標系是隨著物體的大小和位置變化的,單位是長度單位。
相機座標系:以光心為相機座標系的原點,以平行於影象的x和y方向為Xc軸和Yc軸,Zc軸和光軸平行,Xc,Yc,Zc互相垂直,單位是長度單位。
影象物理座標系:以主光軸和影象平面交點為座標原點,x和y方向如圖所示,單位是長度單位。
影象畫素座標系:以影象的頂點為座標原點,u和v方向平行於x和y方向,單位是以畫素計。
從世界座標系到影象座標系的轉換過程如下:世界座標系通過外參矩陣轉換到相機座標系,相機座標系通過內參矩陣轉換到影象畫素座標系(這一步是通過兩步完成的,一,相機座標系通過焦距對角矩陣和畸變係數轉換到影象物理座標系,二影象物理座標系通過畫素轉換矩陣轉換到畫素座標系中)。轉換過程和公式如下(將在接下來的文章裡詳細說明):
三、opencv標定中用到的重要函式和演算法以及獲取矩陣的含義:
findChessboardCorners()用來發現棋盤格的角點位置,這裡用的是haaris角點檢測方法。cornerSubPix()角點位置精確到亞畫素級。
stereoCalibrate()通過角點推算出兩個相機的內參矩陣M1,M2和畸變係數D1,D2,當然外參矩陣隨之也就計算出來了(在影象校正中還沒有用到外參),這裡用到的是張正友相機標定演算法。
stereoRectify()根據內參矩陣和畸變係數計算右相機相對於左相機的旋轉R和平移矩陣T,並將這個旋轉和平移矩陣分解成左、右相機各旋轉一半的旋轉R1,R2和平移矩陣T1,T2,這裡用到的是bouguet極線校正的方法。
initUndistortRectifyMap()和remap()對左右相機拍攝的影象進行校正(在今後的文章中將會詳細介紹實現方法和步驟)。
四、獲取了內參矩陣和畸變係數對影象進行畸變校正時,就是解決影象的畸變問題(徑向畸變是因為透鏡本身工藝的問題,切向畸變是由於安裝問題帶來的)。畸變校正的過程是這樣的,將源影象畫素座標系通過內參矩陣轉化成相機座標系(和影象物理座標系比較多了縮放和Z軸),通過畸變係數校正影象的相機座標,校正後通過內參矩陣將相機座標系轉換成影象畫素座標系,並根據源影象座標的畫素值賦值給新的影象座標(用插值的方法,將在後面的文章中敘述)。
五、雙目平行校正,是針對影象對應的相機座標系進行的,那麼極線校正的時候應該注意就是在四中敘述的畸變校正過程中,在轉換到相機座標系後,左右影象對應的相機座標系分別通過旋轉矩陣R1和R2進行平行極線校正。步驟如下:將源影象畫素座標系通過內參矩陣轉化成相機座標系(和影象物理座標系比較多了縮放和Z軸),通過旋轉矩陣R1和R2進行平行極線校正,然後通過畸變係數校正圖像的相機座標,校正後通過內參矩陣將相機座標系轉換成影象畫素座標系,並根據源影象座標的畫素值賦值給新的影象座標
通過對應關係,每個俯檢視的畫素都在前向畸變檢視像中有對應的位置,兩者的畫素值相等(使用最鄰近法或線性插值等)。俯檢視前方的部分邊緣模糊比較嚴重,這是在原圖中取樣範圍小的原因。