1. 程式人生 > >最詳細、最完整的相機標定講解

最詳細、最完整的相機標定講解

最近做專案要用到標定,因為是小白,很多東西都不懂,於是查了一堆的部落格,但沒有一個部落格能讓我完全能看明白整個過程,絕大多數都講的不全面,因此自己總結了一篇部落格,給自己理一下思路,也能夠幫助大家。(張正友標定的詳細求解還未完全搞明白,後面再加)

在影象測量過程以及機器視覺應用中,為確定空間物體表面某點的三維幾何位置與其在影象中對應點之間的相互關係,必須建立相機成像的幾何模型,這些幾何模型引數就是相機引數。在大多數條件下這些引數必須通過實驗與計算才能得到,這個求解引數(內參、外參、畸變引數)的過程就稱之為相機標定(或攝像機標定)。無論是在影象測量或者機器視覺應用中,相機引數的標定都是非常關鍵的環節,其標定結果的精度及演算法的穩定性直接影響相機工作產生結果的準確性。因此,做好相機標定是做好後續工作的前提,提高標定精度是科研工作的重點所在。

畸變(distortion)是對直線投影(rectilinear projection)的一種偏移。簡單來說直線投影是場景內的一條直線投影到圖片上也保持為一條直線。畸變簡單來說就是一條直線投影到圖片上不能保持為一條直線了,這是一種光學畸變(optical aberration),可能由於攝像機鏡頭的原因。

座標轉換基礎

在視覺測量中,需要進行的一個重要預備工作是定義四個座標系的意義,即 攝像機座標系影象物理座標系、 畫素座標系世界座標系(參考座標系)

一、影象座標系(x,y)至畫素座標系(u,v)

1.兩座標軸互相垂直

這裡寫圖片描述

此時有

這裡寫圖片描述

2.一般情況,兩軸不互相垂直

這裡寫圖片描述

此時有

這裡寫圖片描述

寫成矩陣形式為:

這裡寫圖片描述

二、相機座標系(Xc,Yc,Zc)至影象座標系(x,y)

這裡寫圖片描述

(根據小孔成像原理,影象座標系應在相機座標系的另一邊,為倒立反向成像,但為方便理解和計算,故投影至同側。)

根據三角形相似性原理得:

這裡寫圖片描述

三、世界座標系(Xw,Yw,Zw)至相機座標系(Xc,Yc,Zc)

這裡寫圖片描述

###四、合併公式

這裡寫圖片描述

這裡寫圖片描述

R、T矩陣為相機的外參矩陣。這個1/Zc不對,應該為Zc。

畸變

畸變一般可以分為:徑向畸變、切向畸變

徑向畸變來自於透鏡形狀。
切向畸變來自於整個攝像機的組裝過程。

畸變還有其他型別的畸變,但是沒有徑向畸變、切向畸變顯著,所以忽略不計。

這裡寫圖片描述

徑向畸變(桶形畸變和枕形畸變):
實際攝像機的透鏡總是在成像儀的邊緣產生顯著的畸變,這種現象來源於“筒形”或“魚眼”的影響。
如下圖,光線在原理透鏡中心的地方比靠近中心的地方更加彎曲。對於常用的普通透鏡來說,這種現象更加嚴重。筒形畸變在便宜的網路攝像機中非常厲害,但在高階攝像機中不明顯,因為這些透鏡系統做了很多消除徑向畸變的工作。

這裡寫圖片描述

對於徑向畸變,成像儀中心(光學中心)的畸變為0,隨著向邊緣移動,畸變越來越嚴重。
對於徑向畸變可以通過下面的泰勒級數展開式進行校正:
這裡寫圖片描述
這裡的x、y是影象中的畸變後的位置座標,通過校正得到真實座標。r是該點距成像中心的距離。

切向畸變(薄透鏡畸變和離心畸變):

切向畸變是由於透鏡製造上的缺陷使得透鏡本身與影象平面不平行而產生的。

這裡寫圖片描述

切向畸變可以通過如下公式來矯正:

這裡寫圖片描述
這裡的x、y是影象中的畸變後的位置座標,通過校正得到真實座標。r是該點距成像中心的距離。

opencv畸變模型

徑向畸變模型:

xc= xd (1+k1r^2 +k2r^4 +k3r^6+⋯)
yc= yd (1+k1
r^2 +k2r^4 +k3r^6+⋯)

切向畸變模型:

xc= 2p1xdyd+p2 (r^2 +2xd^2 )
yc= 2p2xdyd+p1 (r^2 +2yd^2 )

可得:

xc= xd (1+k1r^2 +k2r^4 )+2p1xdyd+p2 (r^2 +2xd^2 )
yc= yd (1+k1r^2 +k2r^4 )+2p2xdyd+p1 (r^2 +2yd^2 )

xd,yd為影象中的點(存在畸變),xc,yc是畸變校正後的點。
由公式可得畸變有k1,k2,k3,p1,p2五個引數,對於質量比較好的相機來說,切向畸變很小,可忽略,徑向畸變係數k3也可忽略,只計算k1,k2兩個引數。張正友標定中就預設為p1,p2為0。

標定方法

1、傳統相機標定

最簡單的相機標定為線性標定,即不考慮相機的畸變而只考慮空間座標轉換。
每個座標點有X,Y兩個變數,可列兩個方程,相機內參有5個未知數,外參平移和旋轉各3個,共有11個變數,因此至少需要6個特徵點來求解。

2、非線性標定

當鏡頭畸變明顯時必須考慮畸變,一般較為便宜的網路攝像頭畸變特別大,而價格較貴的工業攝像頭則畸變很小,因為其中已經嵌入了許多消除畸變的程式。這時線性模型轉化為非線性模型,需要通過非線性標定方法求解。有最速下降法,遺傳演算法,高斯牛頓法和神經網路演算法等。

3、張正友標定介紹

(張正友標定只考慮了徑向畸變,沒有考慮切向畸變)

由上面的座標轉換可得:


H即為單應性矩陣
**這裡寫圖片描述**

H為3x3矩陣,並且有一個元素作為齊次座標,則有8個未知元素,一組座標對應兩個方程,則至少需要四組對應的點即可算出單應性矩陣H。
在這裡插入圖片描述
因為R旋轉矩陣為正交矩陣,存在:
在這裡插入圖片描述
代入H可得求出兩組A和H的公式:
在這裡插入圖片描述

矩陣A包含5個元素,需要3組H方可解出A的唯一封閉解,因此在標定時需拍攝3組以上的圖片。由A可計算出相應的外參矩陣。在上述計算中,忽略了相機畸變的影響。對內外參應用最小二乘方法估計實際存在的徑向畸變的畸變係數(忽略切向畸變),最後通過極大似然法進行優化,得到精度較高的解。

標定過程

相機標定步驟:

1、列印一張棋盤格,把它貼在一個平面上,作為標定物。
2、通過調整標定物或攝像機的方向,為標定物拍攝一些不同方向的照片。
3、從照片中提取棋盤格角點。
4、估算理想無畸變的情況下,五個內參和六個外參。
5、應用最小二乘法估算實際存在徑向畸變下的畸變係數。
6、極大似然法,優化估計,提升估計精度。

Matlab工具箱標定:

1、應用程式中找到Camera Calibration

這裡寫圖片描述

2、新增標定板拍攝圖片(按Ctrl可一次新增多張)

這裡寫圖片描述

3、輸入棋盤格每格的尺寸大小

這裡寫圖片描述

4、顯示已檢測出的棋盤格,點選Calibration,開始標定。

這裡寫圖片描述

5、得到標定結果(平均誤差小於0.5即可認為結果可靠,這個地方我還不是很清楚)

這裡寫圖片描述

6、可檢視標定結果和程式

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

opencv標定

1、迴圈讀取圖片
2、使用findChessboardCorners函式檢測角點(需提前輸入角點數)。
棋盤格角點檢測圖
3、使用find4QuadCornerSubpix函式對角點進行亞畫素精確化
4、可用drawChessboardCorners將角點顯示。
5、根據角點數和尺寸建立一個理想的棋盤格(用point向量儲存所有理論上的角點座標)。
6、通過calibrateCamera函式由理想座標和實際影象座標進行標定,可得到標定結果。
7、由projectPoints函式計算反向投影誤差。
在這裡插入圖片描述

標定結果:

matlab標定的內參經過轉置與VS標定的內參基本一致。每一幅影象都有一個外參矩陣,它的作用是:通過將棋盤格上座標系上的角點座標(x,y,0,1)(計算過程中設定參考座標系在棋盤格上左上方角點,Z軸垂直棋盤格平面,因此z為0,1表示齊次座標)左乘外參矩陣再左乘內參矩陣可以得到該外參矩陣對應影象中的相應角點座標。VS的標定結果經過代入點進行上述計算得到的座標與影象基本一致,但matlab的結果不同直接代入並不相同。原因在於兩種方法標定的結果表示形式不同,兩種方法結果中外參矩陣的平移向量相同,但旋轉矩陣結果不一致,原因還在思考中。ps:平時事情比較多,更新比較慢。
ps:如上圖opencv標定結果中內參矩陣裡的2168和2174並不是焦距,而是焦距/每個畫素大小,否則數量級不會這麼大,焦距一般只有幾毫米或幾十毫米。剛看到國內的碩士論文裡有人寫錯了。