相機參數標定(camera calibration)及標定結果如何使用

文章轉自https://blog.csdn.net/aoulun/article/details/78768570

一直都想寫一寫這個主題,但是,一直都感覺有點虛,也沒有去整理。在網上搜了一下,發現大多數都是轉來轉去,看着也是似懂非懂的,讓人很老火。所以,我就按照自己的理解,儘量簡單易懂一點,也便於以後的應用。如有不足或者錯誤之處請指出,還請指出。

1、相機標定的意義

在機器視覺領域,相機的標定是一個關鍵的環節,它決定了機器視覺系統能否有效的定位,能否有效的計算目標物。相機的標定基本上可以分爲兩種,第一種是相機的自標定;第二種是依賴於標定參照物的標定方法。前者是相機拍攝周圍物體,通過數字圖像處理的方法和相關的幾何計算得到相機參數,但是這種方法標定的結果誤差較大,不適合於高精度應用場合。後者是通過標定參照物,由相機成像,並通過數字圖像處理的方法,以及後期的空間算術運算計算相機的內參和外參。這種方法標定的精度高,適用於對精度要求高的應用場合。本文主要寫一寫後者,至於前者,是一個研究的難點和熱點,以後有空再寫。

2、座標系的變換

2.1、小孔成像的原理

小孔成像的原理可以用下圖來說明:

2.2、各個座標系的定義

爲了說明白,建議先介紹圖像的座標系,再逐步推廣到世界座標系,最後說明各個座標系是如何變化的,從而給出相機的內參和外參。

2.2.1、像素座標系

像素座標就是像素在圖像中的位置。一般像素座標系的左上角的頂點就是遠點,水平向右是u,垂直向下是v軸。

例如,在上圖中,任意一個像素點的座標可以表示爲(ui,vi)。

2.2.2、圖像座標系

在像素座標系中,每個像素的座標是用像素來表示的,然而,像素的表示方法卻不能反應圖像中物體的物力尺寸,因此,有必要將像素座標轉換爲圖像座標。

將像素座標系的原點平移到圖像的中心,就定爲圖像座標系的原點,圖像座標系的x軸與像素座標系的u軸平行,方向相同,而圖像座標系的y軸與像素座標系的v軸平行,方向相同。

在圖中,假設圖像中心的像素座標是(u0,v0),相機中感光器件每個像素的物力尺寸是dx * dy,那麼,圖像座標系的座標(x,y)與像素座標系的座標(u,v)之間的關係可以表示爲:

寫成矩陣的形式就爲:

改寫爲齊次座標的形式:

2.2.3、相機座標系

相機座標系是以相機的光軸作爲Z軸,光線在相機光學系統的中心位置就是原點Oc(實際上就是透鏡的中心),相機座標系的水平軸Xc與垂直軸Yc分別於圖像座標系的X軸和Y軸平行。在圖中,相機座標系的原點與圖像座標系的原點之間的距離OcOi之間的距離爲f(也就是焦距)。

上圖中,如果有一個物體成像到圖像座標系,則可以用下圖來表示(B點是相機座標系中物體的點座標,P是圖像座標系中成像的座標):

可以知道相機座標系與圖像座標系的關係爲:

好了,那麼爲什麼OcOi這個距離是焦距呢?下面做一些推導。大部分的文章在介紹這一點的時候,也有欠缺,爲什麼像素座標系會在相機座標系的前面呢,按道理說,相機座標系是以相機的透鏡中心爲原點,那像素座標系和圖像座標系爲什麼不在後面呢?這裏做一個說明。

(1)本文的第一個圖就是小孔成像的原理圖。像平面就是成像的位置,這個是用戶自己設定的,就是CCD傳感器的位置,而焦平面就是鏡頭的焦距所在平面。當像平面剛好和焦平面重合時,此時所成的像是最清晰的。所以,這也就是爲什麼上面的公式中相機座標系的原點到圖像座標系的原點的距離就是焦距。(實際上,由於物理條件的限制,像平面和焦平面是不可能完全重合的。)

(2)同樣是本文的第一個圖,我們可以看到像平面在光學系統的右面,而在推導相機標定的座標系關係時,卻認爲光線先通過成像平面,再在相機座標系上匯聚到一個點,實際上,如果用下圖來說明,可能就更清楚一點。就是推導的時候,把像平面用虛擬像平面代替了。

2.2.4、世界座標系

世界座標系是圖像與真實物體之間的一個映射關係。如果是單目視覺的話,主要就是真實物體尺寸與圖像尺寸的映射關係。如果是多目視覺的話,那麼就需要知道多個相機之間的關係,這個關係就需要在同一個座標系下進行換算。在下圖中,世界座標系的原點是Ow,而Xw,Yw,Zw軸並不是與其他座標系平行的,而是有一定的角度,並且有一定的平移。

當對相機座標系安裝一定的參數,分別繞着X,Y,Z軸做平移和旋轉後,就得到在世界座標系中的座標。

平移表示:

而對於旋轉,可以採用如下的方法,給定一個基本旋轉矩陣和基本矩陣

對於三座標軸旋轉,當繞着X軸旋轉時,保持基本矩陣的第1列不變,有如下的旋轉矩陣

當繞着Y軸旋轉時,保持基本矩陣的第2列不變,有如下的旋轉矩陣

當繞着Z軸旋轉時,保持基本矩陣的第3列不變,有如下的旋轉矩陣

 

那麼,整個相機座標系到世界座標系的變換公式爲

2.3、相機的內參和外參

通過前面的幾個步驟,我們已經得到了各個座標系之間的相互轉換關係,進一步的就可以得到從像素座標系到世界座標系的變換關係:

公式中,紅色的框框就表示相機的外參,可以看到,外參就是相機相對於世界座標系的旋轉和平移變換關係。內參是相機固有的屬性,實際上就是焦距,像元尺寸。同時還可以看到,公式中有一個Zc,它表示物體離光學中心的距離。這也就說明,在標定的時候,如果物體在距離相機的不同位置,那麼我們就必須在不同的位置對相機做標定。簡單點來理解就是,當物體離相機遠的時候,在圖像上就很小,那麼一個像素代表的實際尺寸就大,當物體離相機近的時候,那麼成像效果就大,一個像素代表的實際物體尺寸就小。因此,對於每一個位置都需要去標定。

小插曲:在介紹座標系變換理論的時候,爲什麼要用齊次座標呢?網上很多的文章在這一點上沒有說明白,導致讀者在看的時候糊里糊塗,莫名其妙。有的人就會問了,不就是爲了使得表達的方便嗎?那我只能說,太片面了啊,因爲我之前在這裏也有很多的困惑。所以在這裏,我就按照自己的理解做一些推導。我相信,如果耐心的讀者能夠讀到這裏,希望我們都有一些啓發,畢竟是我個人的理解,至於沒有讀到這裏的,那就只能有緣再見了。

先說一說什麼叫齊次座標系:能夠明顯的區分點與向量,並且便於計算機做圖形處理時進行仿射變換的座標系。

在歐式空間,兩條平行線是不會相交的(可以想象成兩條平行的光線)。但是,再想象一下或者我們經常看到的例子,比如平行的火車軌道,如果我們站在火車軌道的正中間,向很遠處觀察兩條軌道,是不是感覺兩條軌道在很遠處相交了,這就是透視空間。透視的英文單詞是perspective,英文單詞的解釋是:the art of creating an effect of depth and distance in a picture by representing people and things that are far away as being smaller than those that are nearer the front。仔細的揣摩一下就類似於坐在那個地方畫畫,怎麼表達軌道是無限往前走的呢,這就是一種透視的原理。

例如,在歐式空間,表示一個三維的點和一個三維的向量可以採用如下的方法

由於向量只有方向和大小,如何只給出(x,y,z),鬼知道這到底是向量還是點。好了,如何來做呢。

通過矩陣的變換

可以看到,點和向量區分的方式是最後一個數值是否爲1。

(1)從普通座標系變換到齊次座標系

如果是點(x,y,z)則變換爲(x,y,z,1)

如果是向量(x,y,z)則變換爲(x,y,z,0)

(2)從齊次座標系變換到普通座標系

 

如果是點(x,y,z,1)則變換爲(x,y,z)

如果是向量(x,y,z,0)則變換爲(x,y,z)

有了這些準備之後,我們知道,相機成像的過程就類似於上面我們說的透視變換的過程(這個過程不詳細說,大致理解就行,可以參考專業的書籍),也就類似於畫畫。因此,普通座標系上的點,就可以通過在後面加上一個1的方式來實現。又由於標定過程中的各個座標系的變換,實際上就是座標系中各個點的變換關係,因此,採用齊次座標系不僅便於區分,而且有利於後面的計算。想了一下,大致畫一個相機成像的透視變換圖

3、圖像畸變及畸變矯正

3.1、相機的畸變模型

畸變的英文單詞是distortion。從英文的意思來看就是物體看起來是不正常的,比如說形狀改變了,扭曲了或者其他的變化。

造成圖像畸變的原因有很多,總結起來可以分爲兩類:徑向畸變和切向畸變。

3.1.1、徑向畸變

可以這樣來理解,對於透鏡而言,以透鏡的中心作爲原點,往外是透鏡的半徑的方向,當光線越靠近中心的位置,畸變越小,沿着半徑方向遠離中心的時候,畸變越大。典型的徑向畸變有桶形畸變和枕形畸變。如下圖所示。

徑向畸變的矯正公式如下(這裏不給出推導過程,直接使用)

式中,(x,y)是理想的無畸變的座標(圖像座標系),(xdr,ydr)是畸變後圖像像素點的座標,而且,

3.1.2、切向畸變

切向畸變可以這樣理解,當透鏡與成像平面不行時,就產生了畸變,類似於透視變換。打個比方的例子。

切向畸變的矯正公式如下(這裏不給出推導過程,直接使用)

3.2、畸變矯正

通過上面介紹的徑向畸變和切向畸變模型,可以得到兩個模型最終作用於真實圖像後的矯正模型。

爲什麼是相加呢,可以這樣理解,畸變就是距離的變化,而距離的變化反映到座標值上就是加減的關係。

4、相機參數標定到底怎麼用

當求解出了相機的內參和外參後,那麼如何使用這些參數呢?下面做一個大致的說明。

上面的理論部分是通用的,但是,在實際的應用過程中,卻有區別。比如說,在我的項目經驗中,有用到單目視覺的情況,也有用到雙目視覺的情況。

對於單目視覺而言,實際上我們是沒有必要知道世界座標系的,因爲,我們沒必要去探究到底我這一個相機處於世界座標座標系的什麼位置。據我瞭解,如果採用單目視覺的立體圖像匹配,或者空間位置定位,應該需要用到空間位置信息。那麼,在通常的單目視覺應用中,求得內參和畸變參數後,就可以對新拍攝的圖像做變換和矯正。矯正完拍攝的圖像之後,就可以對圖像做其他處理了。

對於雙目視覺而言,需要用到世界座標系。對單目視覺做完內參和畸變參數的矯正之後,就可以用這些變換後的圖像,同時結合世界座標系實現定位或者其他用途了。

歡迎關注公衆號

 

5、一個相機標定的實例

5.1、標定採集的數據圖像

5.2、圖像處理

實際上這一步就是角點提取,有很多算法,例如DoG,FAST,sift,surf等算法。不再一一列舉。下圖是提取角點後的結果(OpenCV函數:findChessboardCorners)。

5.3、相機參數的計算

直接調用OpenCV中的函數  來計算

calibrateCamera()

當輸入一副新的拍攝的圖像後,就可以用計算得到的參數,去矯正這幅圖(本文只是單目視覺的矯正),用OpenCV中的函數 來實現的。

計算的參數結果如下

實際輸入的圖像如下

矯正後的圖像如下

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章