註:原創為CSDN某博主,點擊閱讀原文可以查看。這篇文章作為雙目視覺的補充內容,能夠解決大部分的疑問。
做相機標定對於剛入手的人來說有很多疑惑的點,我總結個人的入手的方法和需要弄明白的問題:
一、相機標定是幹什麼的,需要什麼器材才能做?雙目校正目標是什麼,又需要什麼設備?
二、相機(針孔)模型是什麼樣的?世界坐標系,相機坐標系,圖像物理坐標系,圖像像素坐標系,這四個坐標繫到底是什麼?從世界坐標繫到圖像坐標繫到底是怎麼轉換的?
三、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,即左右相機各旋轉一半達到水平)。
二、針孔相機的模型:三維世界中的物體,經過相機成像系統,變成二維圖像過程如下所示。
世界坐標系:就是物體在真實世界中的坐標,比如黑白棋盤格的世界坐標系原點定在第一個棋盤格的頂點,Xw,Yw,Zw互相垂直,Zw方向就是垂直於棋盤格面板的方向。可見世界坐標系是隨著物體的大小和位置變化的,單位是長度單位。只要棋盤格的大小決定了,無論板子怎麼動,棋盤格角點坐標一般就不再變動(因為是相對於世界坐標系原點的位置不變),且認為是Zw=0.
相機坐標系:以光心為相機坐標系的原點,以平行於圖像的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進行平行極線校正,然後通過畸變係數校正圖像的相機坐標,校正後通過內參矩陣將相機坐標系轉換成圖像像素坐標系,並根據源圖像坐標的像素值賦值給新的圖像坐標