【機器視覺】張氏法相機標定

前幾天大概翻了下網上的資料和《學習OpenCV》相關的部分,打算寫一篇相機標定的總結(只寫張正友法),其中也會結合自己的理解,所以有些地方可能會有錯誤,還望指正。

【WHY:為什麼要進行相機標定?】

先說結論:建立相機成像幾何模型並矯正透鏡畸變

建立相機成像幾何模型:計算機視覺的首要任務就是要通過拍攝到的圖像信息獲取到物體在真實三維世界裡相對應的信息,於是,建立物體從三維世界映射到相機成像平面這一過程中的幾何模型就顯得尤為重要,而這一過程最關鍵的部分就是要得到相機的內參和外參(後文有具體解釋)。

矯正透鏡畸變:我們最開始接觸到的成像方面的知識應該是有關小孔成像的,但是由於這種成像方式只有小孔部分能透過光線就會導致物體的成像亮度很低,於是聰明的人類發明了透鏡。雖然亮度問題解決了,但是新的問題又來了:由於透鏡的製造工藝,會使成像產生多種形式的畸變,於是為了去除畸變(使成像後的圖像與真實世界的景象保持一致),人們計算並利用畸變係數來矯正這種像差。(雖然理論上可以設計出不產生畸變的透鏡,但其製造工藝相對於球面透鏡會複雜很多,so相對於複雜且高成本的製造工藝,人們更喜歡用腦子來解決……)

【HOW:相機標定的原理】

前面已經說過,相機標定的目的之一是為了建立物體從三維世界到成像平面上各坐標點的對應關係,所以首先我們需要定義這樣幾個坐標系來為整個過程做好鋪墊:

世界坐標系(world coordinate system):用戶定義的三維世界的坐標系,為了描述目標物在真實世界裡的位置而被引入。單位為m。

相機坐標系(camera coordinate system):在相機上建立的坐標系,為了從相機的角度描述物體位置而定義,作為溝通世界坐標系和圖像/像素坐標系的中間一環。單位為m。

圖像坐標系(image coordinate system):為了描述成像過程中物體從相機坐標繫到圖像坐標系的投影透射關係而引入,方便進一步得到像素坐標系下的坐標。 單位為m。

像素坐標系(pixel coordinate system):為了描述物體成像後的像點在數字圖像上(相片)的坐標而引入,是我們真正從相機內讀取到的信息所在的坐標系。單位為個(像素數目)。

關於這四個坐標系更詳細的定義我就不說了,因為下面的圖可以更好地表達這四個坐標系之間的關係:

世界坐標系:Xw、Yw、Zw。相機坐標系: Xc、Yc、Zc。

圖像坐標系:x、y。像素坐標系:u、v。

其中,相機坐標系的 軸與光軸重合,且垂直於圖像坐標系平面並通過圖像坐標系的原點,相機坐標系與圖像坐標系之間的距離為焦距f(也即圖像坐標系原點與焦點重合)。像素坐標系平面u-v和圖像坐標系平面x-y重合,但像素坐標系原點位於圖中左上角(之所以這麼定義,目的是從存儲信息的首地址開始讀寫)。

在這裡我們先引入「棋盤」的概念:

棋盤是一塊由黑白方塊間隔組成的標定板,我們用它來作為相機標定的標定物(從真實世界映射到數字圖像內的對象)。之所以我們用棋盤作為標定物是因為平面棋盤模式更容易處理(相對於複雜的三維物體),但與此同時,二維物體相對於三維物體會缺少一部分信息,於是我們會多次改變棋盤的方位來捕捉圖像,以求獲得更豐富的坐標信息。

下面將依次對剛體進行一系列變換,使之從世界坐標系進行仿射變換、投影透射,最終得到像素坐標系下的離散圖像點,過程中會逐步引入各參數矩陣。

從世界坐標繫到相機坐標系:

剛體從世界坐標系轉換到相機坐標系的過程,可以通過旋轉和平移來得到,我們將其變換矩陣由一個旋轉矩陣和平移向量組合成的齊次坐標矩陣(為什麼要引入齊次坐標可見附錄)來表示:

其中,R為旋轉矩陣,t為平移向量,因為假定在世界坐標系中物點所在平面過世界坐標系原點且與Zw軸垂直(也即棋盤平面與Xw-Yw平面重合,目的在於方便後續計算),所以zw=0,可直接轉換成式1的形式。其中變換矩陣

即為前文提到的外參矩陣,之所稱之為外參矩陣可以理解為只與相機外部參數有關,且外參矩陣隨剛體位置的變化而變化。

從相機坐標繫到理想圖像坐標系(不考慮畸變):

這一過程進行了從三維坐標到二維坐標的轉換,也即投影透視過程(用中心投影法將形體投射到投影面上,從而獲得的一種較為接近視覺效果的單面投影圖,也就是使我們人眼看到景物近大遠小的一種成像方式)。我們還是拿針孔成像來說明(除了成像亮度低外,成像效果和透鏡成像是一樣的,但是光路更簡單)。

成像過程如圖二所示:針孔面(相機坐標系)在圖像平面(圖像坐標系)和物點平面(棋盤平面)之間,所成圖像為倒立實像。

但是為了在數學上更方便描述,我們將相機坐標系和圖像坐標系位置對調,變成圖三所示的布置方式(沒有實際的物理意義,只是方便計算):

此時,假設相機坐標系中有一點M,則在理想圖像坐標系下(無畸變)的成像點P的坐標為(可由相似三角形原則得出):

將上式化為齊次坐標表示形式為:

從理想圖像坐標繫到實際圖像坐標系(考慮畸變):

透鏡的畸變主要分為徑向畸變切向畸變(還有薄透鏡畸變等等,但都沒有徑向和切向畸變影響顯著,所以我們在這裡只考慮徑向和切向畸變)。

徑向畸變是由於透鏡形狀的製造工藝導致。且越向透鏡邊緣移動徑向畸變越嚴重。實際情況中我們常用r=0處的泰勒級數展開的前幾項來近似描述徑向畸變。矯正徑向畸變前後的坐標關係為:

由此可知對於徑向畸變,我們有3個畸變參數需要求解。

切向畸變是由於透鏡和CMOS或者CCD的安裝位置誤差導致。切向畸變需要兩個額外的畸變參數來描述,矯正前後的坐標關係為:

由此可知對於切向畸變,我們有2個畸變參數需要求解。

綜上,我們一共需要5個畸變參數(k1、k2、k3、p1和p2 )來描述透鏡畸變。

從實際圖像坐標繫到像素坐標系:

由於定義的像素坐標系原點與圖像坐標系原點不重合,假設像素坐標系原點在圖像坐標系下的坐標為(u0,v0),每個像素點在圖像坐標系x軸、y軸方向的尺寸為:dx、dy,且像點在實際圖像坐標系下的坐標為(xc,yc),於是可得到像點在像素坐標系下的坐標為:

化為齊次坐標表示形式可得:

若暫不考慮透鏡畸變,則將式2與式5的轉換矩陣相乘即為內參矩陣M:

之所以稱之為內參矩陣可以理解為矩陣內各值只與相機內部參數有關,且不隨物體位置變化而變化。

最後用一幅圖來總結從世界坐標繫到像素坐標系(不考慮畸變)的轉換關係:

【WHAT:內外參具體求解方法】

現在我們已經知道要想對相機進行標定,就需要求解出相機的內外參矩陣以及畸變係數,那麼在數學上具體應該怎樣求解呢?

假設我們提供K個棋盤圖像,每個棋盤有N個角點,於是我們擁有2KN個約束方程。與此同時,忽略畸變的情況下,我們就需要求解4個內參和6K個外參(內參只於相機內部參數有關,外參卻隨目標點位置變化而變化),也就是說,只有當2KN>=4+6K的時候,也即K(N-3)>=2時,才能求出內外參矩陣。同時,無論在一張棋盤上檢測到多少角點,由於棋盤上角點的規則布置使得真正能利用上的角點只有4個(在四個方向上可延展成不同的矩形),於是有當N=4時,K(4-3)>=2,即K>=2,也就是說,我們至少需要兩張棋盤在不同方位的圖像才能求解出無畸變條件下的內參和外參。

實際上我們往往會在一張棋盤上布置更多的角點,因為這樣就可以通過最小二乘法求得最優解了,同樣地,我們會需要至少10張以上的棋盤圖像,目的是考慮數值穩定性和提高信噪比,得到更高質量的結果。

與此同時,我們在這裡引入單應性的概念。在計算機視覺中的單應性被定義為從一個平面到另一個平面的投影映射關係,前面我們已經得到了像素坐標系和世界坐標系下的坐標映射關係:

因此,我們定義相機標定的單應性矩陣(從物體平面到成像平面)為:

這裡引入的s為任意尺度的比例係數。單應性矩陣描述了物體在世界坐標系和像素坐標系之間的相對位置關係(包含了內參和外參)。接下來我們繼續推導內外參數和畸變係數的具體求解方法。

首先不考慮透鏡畸變情況下,求解內參和外參:

我們在上面的推導已經知道了單應性矩陣

先將H化為H=[h1 h2 h3],再分解方程可得:

因為旋轉向量在構造中是相互正交的,即r1和r2相互正交,由此我們就可以利用「正交」的兩個含義,得出每個單應性矩陣(也即每個棋盤方點陣圖像)提供的兩個約束條件:

旋轉向量點積為0(兩垂直平面上的旋轉向量互相垂直):

替換和並化簡可得:

旋轉向量長度相等(旋轉不改變尺度):

替換掉r1和r2可得:

則可將兩個約束條件轉化為:

由上式可知,兩約束中的單項式均可寫為

的形式,同時易知B為對稱矩陣,真正有用的元素只有6個(主對角線任意一側的6個元素)。於是可展開為如下形式:

由此,兩約束條件可等價為:

前面的討論我們已經知道,棋盤圖像數目滿足就可求出內外參數,此時b有解,於是由內參數B的封閉解和b的對應關係即可求解出內參數矩陣中的各個元素(具體形式這裡不給出)。得到內參數後,可繼續求得外參數:

其中又由旋轉矩陣性質有

則可得

進一步考慮透鏡畸變情況,求解畸變係數:

根據式3和式4我們可以得到矯正畸變後的坐標和矯正前的坐標關係為:

有了上式的對應關係,又已知相應的內外參數,再利用大量給定的坐標數據即可進一步求得畸變係數(這裡就可以交給計算機來解決了)。

到此為止便是關於相機標定的一系列matters以及求解所有參數的具體方法了,接下來知道了原理後就可以「義正言辭」地調用OpenCV里的函數進(si)行(ke)求(dai)解(ma)了~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

附錄1:聊聊「齊次坐標」

首先,為什麼要定義齊次坐標?

比如現在我們面前有一條馬路,這條馬路延伸到無窮遠處,於是我們在笛卡爾空間去描述這一變化規律會描述成:在同一平面有兩條平行線,那麼這兩條平行線將永遠都不會相交,也就是說著兩條馬路牙子(偷笑)將永遠不會相交,然而實際生活中我們看到的景象是:馬路向遠處延伸,間距越來越窄,到盡頭處相交!這是因為我們的眼睛對物體有「近大遠小」的處理(視角),也就是我們平時所說的投影透視,那麼對於這種情況我們在數學上應該怎麼合理地去描述呢?於是便引入了「齊次坐標」來描述啦~~

齊次坐標說白了就是用N+1維去描述一個N維的坐標。

再來看一下齊次坐標與笛卡爾坐標的轉化關係:

笛卡爾坐標:(x/w,y/w)——齊次坐標:(x,y,w)

有了齊次坐標的定義,接下來我們就可以了解到為什麼稱之為「齊次」了:

假如齊次坐標系下的坐標為(1,3,5),那麼轉換到笛卡爾坐標系下的坐標即為(1/5,3/5);同理假如齊次坐標系下的坐標為(2,6,10),那麼轉換到笛卡爾坐標系下的坐標即為(2/10,6/10),化簡後其值仍為(1/5,3/5)……於是我們就可以知道:對於這個例子來說,齊次坐標系下任何形式為(1a,3a,5a)的坐標(a不為0)在笛卡爾坐標系下都代表著同一個坐標(1/5,3/5),類似地,便有了「齊次」的說法,由此也引出了齊次坐標的「伸縮不變性」

接著上面馬路牙子的問題,為什麼有了齊次坐標的表示方式我們就可以描述投影透視關係了呢?為什麼無窮遠處的馬路牙子(-。-)就能相交了呢?鏘鏘~繼續往下看:

現在我們在笛卡爾空間定義兩條直線:

我們知道在這種情況下兩條直線是不可能相交的,但是再來轉換到齊次坐標表示看看:

此時就存在有解條件了:w=0時有解,此時交點為(x,y,0),同時w=0表示這個點在無窮遠處,於是兩條平行線(馬路牙子)在無窮遠處可相交!

綜上所述,齊次坐標在圖形學和計算機視覺中是一個很重要的概念,這也是我們為什麼要在這裡引入齊次坐標來表示,一方面是因為它更易於進行仿射幾何變換(具體解釋見附錄2),另一方面也能夠用來明確區分向量和點(至於為什麼能區分向量和點…見附錄3吧…)。

附錄2:再聊「齊次變換」

剛說到引入齊次坐標可以更好地進行仿射變換,我們知道在笛卡爾坐標系下的仿射變換是旋轉矩陣和縮放矩陣的特權,對於平移變換來說,不能簡單地用矩陣相乘來表達,原因如下:

假設在笛卡爾坐標系下有一點P(px,py,pz),平移向量為t(tx,ty,tz),如果我們想找到一個矩陣M,使得:

你會發現在笛卡爾坐標系下永遠都找不到這樣一個滿足條件的M。但是在齊次坐標系中的點P(px,py,pz,1),我們可以找到一個向量

像這樣在齊次坐標系下使用4個分量來描述三維坐標變換,可以使得平移變換在矩陣中更加方便使用,最終的變換矩陣形式更加緊湊。

附錄3:繼續聊「齊次坐標」……

莫名又挖了個坑……但是說到這裡肯定還是會有人比較好奇為什麼齊次坐標可以區分向量和點,所以還是再寫點吧……

假設我們在齊次坐標系下找到了這樣一組基:

於是我們可以找到一組係數(v1,v2,v3),將向量v表示成:

對於齊次坐標系下的一個點P,可以表示成位置向量:

將上面兩個式子均寫成齊次坐標系下的矩陣形式:

我們可以看到,(a,b,c,o)為坐標基矩陣,右側列向量分別為向量v和點p在齊次坐標系下的坐標。於是,若想在齊次坐標系下的三維坐標中表示向量,則第四項係數為0,若想表示點,則第四項係數為1,這樣就可以很方便地區分出點或者向量了。填坑完畢……

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

【全劇終】


推薦閱讀:

機器視覺、圖像處理、機器學習領域相關代碼和工程項目和數據集 集合
ADAS領域中,雷達和機器視覺各有什麼優劣,未來的趨勢是共存還是某個徹底勝出?
海康威視研究院在計算機視覺、模式識別這方面的技術水平如何?
如何看待國內機器視覺行業的發展?希望以公司為例盤點!

TAG:计算机视觉 | 机器视觉 |