相機標定(具體過程詳解)張正友、單應矩陣、B、R、T
首先先宣告一點,本文介紹的方法並非很多文章中介紹的方法只是應用,直接呼叫matlab或者opencv的內部原有相機標定函式,本文主要介紹求解相機引數的一個大體流程。
相機標定分:內參標定、外參標定、c矩陣
內參標定:採用棋盤圖或者點陣圖,將相機固定(焦距、光圈等內部元素)。用相機拍攝多組不同角度的棋盤圖,這點和普通的matlab的棋盤圖示定類似。matlab利用棋盤圖示定,它也給出了標定的外參,但是給定的並非我們所求,而是將世界座標系定在了棋盤圖上,我們需要的世界座標系是固定不變的或者至少是與相機的相對位置不會發生改變。
內參標定輸入為:畫素座標u、v和世界座標x、y、z,該z沒有定義具體的數值,因為在此處的求解不會應用到,並且我們此步也無法求得。那麼這些引數怎麼來的呢?u、v為影象中棋盤格的角點座標,與其對應的x、y表示該角點在整個棋盤圖下的座標,該座標系定在棋盤圖上,因此我們拍攝5次影象,這些影象相應的座標應該相同。為了計算時資料的變換較為方便,這裡z也給出,值給0或1都行,不影響計算。
內參標定輸出為:內部引數+相機畸變引數。內部引數:fu、fv、u、v;相機畸變引數:k1,k2
內參求解步驟:
1.求單應矩陣
這裡的A矩陣為內參矩陣,上面兩個式子其實不難證明,
第一個式子:其實是和的點乘關係,如果他們垂直那麼點乘便為0。
所以
第二個式子是
由此便可以看出這兩步都是在說明r1和r2是單位正交的關係。
利用一些變換和約束進行單應矩陣的求解。
本文直接呼叫的matlab的單應舉證求解程式碼。
H = homography(img(:,tnum:tnum+snum(i)-1),world(:,tnum:tnum+snum(i)-1));
其中img代表影象座標的uv,world代表世界座標的xy。tnum:tnum+snum(i)-1)則是將我們拍的五組圖分散開來。
2.單應構造v,進行B的求解
由於B為對稱矩陣,因此B中元素可以寫為
大家可以從上面看到B是由A矩陣組成的,那們A的組合滿足的關係,B也滿足
這裡我們有h由於v了,用奇異值分解最小奇異值對應的特徵向量便可以表示b
[u s v]=svd(V); %用正交分解解出b
b=v(:,6);
這裡我沒寫如何構造V,直接按照上面的公式一步一步求解就好了。
3.利用B,求出內參矩陣A
4.優化——提高精度關鍵步驟LM演算法
上邊的λ為了精確,選用了兩個的平均值。
求解出來的旋轉矩陣需要進行正交化處理。
RL=[r1 r2 r3];
[u s v]=svd(RL);
RL=u*v';
利用上述步驟求解出了外參矩陣。
因此我們可以通過求解出的內參矩陣和外參矩陣,輸入外參[X,Y,Z]求得內參[u’,v’]。
x=A*ML*M(:,tnum:tnum+snum(i)-1);
其中M矩陣為外引數據,ML為擁有R和t的外參矩陣,x求得的內參[u’,v’]。
這裡需要強調,為了歸一化處理保證Z為1,因此X=X/Z;Y=Y/Z,即[λu’,λv’,λ]/λ
x=[x(1,:)./x(3,:) ; x(2,:)./x(3,:); x(3,:)./x(3,:)];
最後利用LM方法,優化x的[u’,v’,1]與實際的[u,v,1]的差值,使其達到最小,進而優化引數。
5.利用理想的[u’,v’]與實際的[u,v]求解內參
這裡僅考慮了主要畸變原因:徑向畸變,因此求解的畸變引數僅為k1、k2
本節需要強調一下,下面出現的[u,v]其實是設成了理想的影象座標,而像[u’,v’]的一項為實際影象座標,這裡要注意。至於理想的影象座標來源是通過實際座標通過修正的外參矩陣和內參矩陣的轉變而來的。
首先我們研究理想的外部座標系有畸變時
又因為其與影象座標是對應關係
因此影象畸變表示為
下面的矩陣形式是我們主要用到的
最終公式
k=inv(D'*D)*D'*d;
6.把畸變係數k1、k2代入矩陣,如上一次優化一樣
比較求得和實際影象的是否一樣,需要注意這裡的[u,v]雖說理想的,但是他們並不直接來自影象座標,而是通過外部資料[X,Y,Z]變化的到的。
7.優化後通過優化的引數,做最後優化
優化完後,我們便可以用我們優化過的內參外參以及畸變係數,求取外部座標對應的“實際內參”,然後
再求取一次k1,k2
此時我們的內部引數便全部求完了
這中間可以加入一步初始化,類似於F初始化求解。