图像处理中消除相机透镜畸变和视角变换
from:圖像處理中消除相機透鏡畸變和視角變換
一般的針孔相機模型如下:
三維坐標點經(jīng)過透視投影變換,轉(zhuǎn)換到一個圖像平面坐標點。
而相機透鏡還存在一定的畸變,包括橫向畸變和切向畸變。
?
因此,針孔相機模型又被擴展為以下模型:
首先,世界坐標被轉(zhuǎn)換為相機坐標,由X,Y,Z到x,y,z;
然后,歸一化,z=1處,x,y的投影坐標x`,y`;
接下來,對投影坐標,進行畸變處理;
最后,由相機坐標轉(zhuǎn)換到圖像坐標。
?
在使用廣角鏡頭或魚眼相機時,原始圖像存在畸變比較嚴重。
在圖像識別的很多應(yīng)用場景中,消除圖像的畸變是圖像預(yù)處理的首要問題。
通過相機標定,很容易拿到相機的內(nèi)部參數(shù),包括焦距、光心和畸變系數(shù)。
以上過程,就是透鏡畸變前后圖像坐標變換的公式。具體步驟如下:
1. 由圖像坐標系反變換到相機坐標系中
2. ?然后,校正反變換R-1,一般無校正變換的相機,默認為單位矩陣
3. 歸一化,并進行相機透鏡畸變處理
4. 由相機坐標轉(zhuǎn)換到圖像坐標。
由此,得到由針孔模型到透鏡畸變畸變模型相互變換的對應(yīng)關(guān)系u <--> mapx, v <--> mapy
initUndistortRectifyMap函數(shù)就是完成了以上工作。
?OpenCV中,remap與undistortion都是消除畸變的函數(shù),undistortion在設(shè)置了一些參數(shù)后調(diào)用了remap函數(shù),二者的算法實質(zhì)是一樣的。由目標圖像的坐標,找到對應(yīng)的原始圖像坐標,然后將其值復(fù)制到目標圖像。大致思路是如此,由于圖像大小和變換,需要插值或近似的方法,如最鄰近法、線性插值等
?
圖像視角變換
如圖像由前向視角frontview轉(zhuǎn)換為俯視角birdview。
一般來講,相機向下傾斜時,相機前向視角frontview的視角范圍比較大,而俯視birdview需要的視角比較小(涉及地面的視角部分)。
?
針孔模型下,在前向視角圖像中,截取涉及地面的部分,并通過透視變換,轉(zhuǎn)換為俯視視角。地面的一個矩形區(qū)域,在前向視圖中會大致是一個三角形或梯形的形狀,而在俯視圖中,仍是一個矩形圖像,且能保留線性、平行性特征。
?
如下,一個前向廣角視圖,轉(zhuǎn)換為俯視圖。
前向視圖:
俯視圖:
?
轉(zhuǎn)換方法:
首先,通過標定獲取相機的外部參數(shù),世界坐標系中相機的位置Position和傾角(相對于x,y,z坐標軸的角度),即M=R|t。并假定地面的z坐標為z=0.
然后,獲取俯視圖內(nèi)的三維地面坐標。z=0,地面區(qū)域的實際大小與俯視圖的大小成一定比例,即俯視圖中一個像素的位置(u`,v`),在地面坐標上,也有對應(yīng)的位置(x`, y`, 0) = (u`*spaceSolution, v`*spaceSolution, 0).spaceSolution是空間像素的大小,如一個像素的高和寬是0.05米。。
然后,由上面第二塊公式,通過位置變換,畸變計算,和相機參數(shù)變換,三個步驟,將每個地面位置坐標(x`,y`, 0)轉(zhuǎn)換為前向視圖中的坐標(u, v)。
此時,前向畸變視圖像與俯視圖像有一個對應(yīng)關(guān)系(u,v) <--> (u`,v`)。
?
通過對應(yīng)關(guān)系,每個俯視圖的像素都在前向畸變視圖像中有對應(yīng)的位置,兩者的像素值相等(使用最鄰近法或線性插值等)。俯視圖前方的部分邊緣模糊比較嚴重,這是在原圖中采樣范圍小的原因。
總結(jié)
以上是生活随笔為你收集整理的图像处理中消除相机透镜畸变和视角变换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。