相機標定實用方案
相機標定就是確定相機內參和外參的過程,其結果精度會直接影響視覺系統后續工作的准確性。
一.OPENCV方法
在opencv中提供了一組函數用於實現相機的標定,標定返回的值包括:相機內參矩陣(fx fy xc yc)、相機外參矩陣(R t)以及畸變矩陣。
標定的步驟如下:
1. 准備棋盤格,棋盤格圖片可以自行打印,以下使用10*7方格的棋盤格,交點則為9*6,棋盤格的大小1mm,即 gridsize=1
2. 拍照,拍照的原則是多角度,根據理論至少要兩種角度的拍照,實際中通常會拍20張左右;
3. 使用opencv提供的角點檢測函數findChessboardCorners找到棋盤格中的角點,並將每幅圖片的角點值存放到list中,同時將棋盤格的角點的三維坐標存放到另一個list。
4. 使用calibrateCamera函數獲取內存矩陣、畸變矩陣、旋轉矩陣以及轉移矩陣。
5.使用undistort函數將畸變的圖像進行校正並查看校正后的圖片效果。
下面我們用另外的方法,詳細介紹流程。
二.坐標系
相機標定涉及到了四大坐標系,分別為:
像素坐標系
圖像物理坐標系
相機坐標系
世界坐標系
為了進行相機標定,必須已知世界坐標系中足夠多的三維空間點坐標,找到這些空間點在圖像中投影點的二維圖像坐標,並建立對應關系。世界坐標系中某個給定點投影到圖像坐標系中被分為兩個步驟:
機器視覺中常用的有兩種不同類型的鏡頭:普通鏡頭和遠心鏡頭。使用普通鏡頭時,世界坐標系到圖像坐標系為透視投影;使用遠心鏡頭時為平行投影。
三.相機標定方法分類
相機標定方法有:傳統相機標定法、主動視覺相機標定法、相機自標定法。
1. Tsai兩步法是先線性求得相機參數,之后考慮畸變因素,得到初始的參數值,通過非線性優化得到最終的相機參數。Tsai兩步法速度較快,但僅考慮徑向畸變,當相機畸變嚴重時,該方法不適用。
2. 張氏標定法使用二維方格組成的標定板進行標定,采集標定板不同位姿圖片,提取圖片中角點像素坐標,通過單應矩陣計算出相機的內外參數初始值,利用非線性最小二乘法估計畸變系數,最后使用極大似然估計法優化參數。該方法操作簡單,而且精度較高,可以滿足大部分場合。詳細原理見《從零開始學習「張氏相機標定法」(一)成像幾何模型》。
3. 基於主動視覺的相機標定法是通過主動系統控制相機做特定運動,利用控制平台控制相機發生特定的移動拍攝多組圖像,依據圖像信息和已知位移變化來求解相機內外參數。這種標定方法需要配備精准的控制平台,因此成本較高。
4. 分層逐步標定法是先對圖像的序列做射影重建,在重建的基礎上進行放射標定和歐式標定,通過非線性優化算法求得相機內外參數。由於初始參數是模糊值,優化算法收斂性不確定。
5. 基於Kruppa的自標定法是通過二次曲線建立關於相機內參矩陣的約束方程,至少使用3對圖像來標定相機。圖像序列長度會影響標定算法的穩定性,無法保證射影空間中的無窮遠平面。
四.MATLAB相機標定應用程序
MATLAB自帶相機標定應用程序,有camera calibrator和stereo camera calibrator兩類相機標定應用程序。其操作簡單、直觀,能夠獲得相機的內、外參數以及畸變參數等。
其中,camera calibrator用於單目相機標定;stereo camera calibrator用於雙目相機標定。兩者操作方式相同,唯一區別在於stereo camera calibrator添加圖片時會彈出添加兩個相機圖片的操作框。
五.標定板准備(實驗室經費有限,只能自己制作)
平面標定板具有以下幾個優點:
1. 易於操作;
2. 尺寸可以制作的非常精確;
3. 非常方便應用在背光照明應用中,只需要使用透明材料制作放置標志點的底盤即可。
使用MATLAB編程進行棋盤標定板的制作,將圖片打印后固定在一塊平板上。程序如下:
J = (checkerboard(300,3,4)>0.5); %生成黑白棋盤圖像
figure, imshow(J) %顯示黑白棋盤圖像
imwrite(J,'plate.jpg');%保存黑白棋盤圖像
效果如圖:(感覺有點寒酸呀,“但這不重要”,沒條件自己創造)
六.Camera Calibrator應用程序
camera
calibrator操作界面如下:
對於標定圖像數量,位姿越多,標定結果也會越精確,建議在10到20幅之間。按照上圖中的1、2、3進行相機標定操作。我們可以選擇徑向畸變系數以及是否計算切向畸變和傾斜,通過優化選項可以設置內參矩陣以及徑向畸變參數的輸出形式。
1.添加標定圖像后顯示界面如下圖:
2.相機標定后顯示界面會顯示相機與標定板之間的位置關系。
3.相機參數輸出camera calibrator應用程序相機標定參數輸出如圖所示:
高亮:MATLAB相機標定結果中的內參矩陣默認格式為
,其中,、
分別為u軸和v軸的有效焦距; 為u軸和v軸的不垂直因子,一般令s=0;(u0,v0)是光學中心。注意事項:
1. 制作棋盤格標定板時,黑色方格與白色方格尺寸需要相同,所有方格尺寸一致;
2. 采集標定板圖像時,應采集多幅不同位姿的標定板圖像,采集圖像數量不應太少,建議10~20幅為宜;
3. 采集圖像時,相機的焦距不能調節,否則會改變相機的內參數,導致標定失敗;
4. MATLAB相機標定程序能夠自動計算重投影誤差,重投影誤差越小表示相機標定的精度越高。
七.相機標定參數的准確度
相機標定過程中如果標定板放置不適當的話將會導致相機參數中某個參數或某些參數不能得到唯一值。為了得到高准確度的相機參數必須避免這種情況的發生。除了這個影響外,影響相機參數准確度的主要因素就是用於進行相機標定的圖像數量。下面顯示了用於相機標定的圖像數量對參數的影響。
從圖中可以看出相機參數的准確度隨使用圖像數量的增加而明顯增加。為什么使用相當多的標定圖像可以提高相機標定精度?這主要是因為相機參數之間存在不容忽視的相關性,這些參數只能通過多次無關測量進行求解。為了得到更准確的相機參數,我們需要這樣做:
1. 標定板在圖像中最好能夠覆蓋整個視野(覆蓋圖像的每個角落可以使得徑向畸變系數更准確);
2. 標定板覆蓋較大的深度范圍(將標定板繞它的x軸和y軸旋轉或者放置在不同距離的位置上)。