天天看點

一文圖解單目相機标定算法

有一天,蟹老闆找底下的員工川建國同學:

一文圖解單目相機标定算法
一文圖解單目相機标定算法
一文圖解單目相機标定算法
一文圖解單目相機标定算法
一文圖解單目相機标定算法

等蟹老闆走後,然後轉頭問旁邊的學霸李雷同學:

一文圖解單目相機标定算法
一文圖解單目相機标定算法

李雷同學整理了下情緒:

一文圖解單目相機标定算法

有人反映哦,有時候我們發出來的技術貼太硬了,不友善去了解,于是,就有了上面這個嘗試,在開始正課之前,我們先講一段故事。如果大家覺得OK,後面我們将繼續用這種方式來講課,如果不OK,請大家在我們評論區提供您寶貴的意見。

這次單目相機标定教程,預計有三期,第一期講單目相機成像過程,第二期講MATALAB和OpenCV的單目相機标定實踐,第三期則講張正友标定法的原理。這裡是3D視覺工坊嘉賓,Atlas博士生計算機視覺大講堂,緻力于把計算機視覺知識講得不那麼無趣!

01 什麼是相機标定?

一文圖解單目相機标定算法

說到相機标定,就要先說什麼是傳感器的标定。我們知道,任何傳感器,它都是存在有誤差的,那麼狹義上說,标定就是去校正這部分誤差,讓傳感器盡量準确一點。我們來看相機标定前後輸出圖像的差别:

一文圖解單目相機标定算法

圖1 相機标定前後輸出圖像的差别

有人說了,那為什麼相機出廠前,它不提前做好标定呢?

李雷同學又鄙夷了一次建國同學:

一文圖解單目相機标定算法
一文圖解單目相機标定算法

出廠前相機标定,廠家想做(誰不想自己的傳感器準一點呢),但這個真還不是廠家懶,它真做不了。因為相機要标定的參數,跟相機實際的光圈、焦距大小有關,而這兩個參數,在一般的工業相機中都是可調節的,是以隻能你自己來标定。

一文圖解單目相機标定算法

常見單目相機标定方法是張正友标定法,這在很多軟體,比如說MATLAB、或者庫OpenCV中都有相應的實作。至于相機标定,要标定哪些參數,先讓我來和你說一下單目相機的成像模型。

一文圖解單目相機标定算法

哦,對了,要補充一點,我們常說的标定可不光光指糾正傳感器的誤差,當涉及到兩個或者多個傳感器的标定的時候,往往還包括計算出這些傳感器間的互相位置關系。比如說在機器人系統裡,我們經常需要在不同坐标系下轉換位置關系,那麼我們所說的一些标定還包括标定出這些關節、傳感器之間的互相位置關系。再比如說我們雙目相機的标定,就包括左相機、右相機的傳感器誤差标定,還包括它們之間互相位置關系的這麼一個标定。

概括一下,常說的标定包括兩部分内容:傳感器誤差的校正、傳感器互相之間的位置關系。​

一文圖解單目相機标定算法

而單目相機的标定主要指前者,傳感器誤差的校正,常用的方法是張正友标定法。

一文圖解單目相機标定算法

02 理想單目相機成像模型

一文圖解單目相機标定算法
一文圖解單目相機标定算法

實際上,小孔成像的模型其實可以看作是針孔相機模型的基礎:

一文圖解單目相機标定算法

圖2 小孔成像模型

進一步地,針孔相機模型可以簡化為下面這個模型:

一文圖解單目相機标定算法

圖3 針孔相機模型(未翻轉)

圖中,P是物點, 是前者在CCD上成像的像點,而是相機的光心,則為成像平面到光心的距離,我們稱之為焦距。

實際上,焦距的定義會更複雜,是所有平行光透過透鏡彙聚一點,那一點到透鏡光心的距離,它就涉及到攝影裡非常專業的概念最小彌散圓了,我們之後會講一期相機光圈、焦距、景深、視場大小、最佳成像距離的專欄。​

這裡先把模型簡化一下吧,下面我們來講整個成像過程,在相機成像模型中,主要有四大坐标系:世界坐标系、相機坐标系、圖像坐标系、像素坐标系。

一文圖解單目相機标定算法

圖4 四大坐标系

其中:

世界坐标系(3D):世界坐标系就是以外界某個參考點建立的坐标系,機關為mm,或者m。

相機坐标系(3D):以光心建立相機坐标系,其中軸指向相機的正前方。

圖像坐标系(2D):光心在成像平面的投影,也就是點建立另一坐标系,稱為圖像坐标系,機關為mm。

像素坐标系(2D):像素坐标系是我們最終使用者所看到的,也就是坐标系的原點在圖像左上角,機關為像素。​

那麼這中間,我們怎麼建立實際實體點(世界坐标系)到圖像上點(像素坐标系)的一一映射呢?需要三步轉換,也就是:

世界-> 相機 -> 圖像 -> 像素​

這中間,這些坐标系有什麼差别,它們是怎麼轉換的?請看下面的文章。

2.1世界坐标系 -> 相機坐标系

我們知道,世界坐标系就是以外界某個參考點建立的坐标系,而相機坐标系則是以相機的光心作為坐标原點,光軸的正方向作為Z軸建立的坐标系,兩者屬于剛體變換,隻需要進行旋轉和平移,如下所示:

一文圖解單目相機标定算法

圖5 世界坐标系到相機坐标系的轉換

一文圖解單目相機标定算法

為了統一旋轉和平移,我們将其寫為齊次形式,至于為什麼要用齊次,我們之後的欄目裡也會說,總而言之是這樣的。​

2.2 相機坐标系 -> 圖像坐标系

在完成了世界坐标系 -> 相機坐标系的轉換後,我們再從相機坐标系 -> 圖像坐标系。為了友善描述,我們将針孔相機模型對稱翻轉過來,如下圖所示,從數學的角度,它們是等價的:

想不明白沒關系,這裡就算是不等價的,我們就假設相機的電子裝置已經幫我們做好了這樣一個翻轉​

一文圖解單目相機标定算法

圖6 針孔相機模型(翻轉)

先回顧一下前面所說的,如我們之前所說:P是物點、P’是像點,現在我們将它翻轉過來了,記作小寫的p。其中:

一文圖解單目相機标定算法
一文圖解單目相機标定算法
一文圖解單目相機标定算法

跟之前的公式統一一下,寫為齊次形式:

一文圖解單目相機标定算法

  2.3 圖像坐标系 -> 像素坐标系

在圖像坐标系中,坐标的原點在圖像中間,而我們平時處理圖像時用的坐标系,稱為像素坐标系,坐标系的原點在圖像的左上角,此外它們的度量機關也不同,前者的機關是mm,而後者的機關是像素。如下圖所示,兩個坐标系之間的差别:

一文圖解單目相機标定算法
一文圖解單目相機标定算法

圖7 圖像坐标系和像素坐标系的差别

一文圖解單目相機标定算法

CCD并不是一個正方形,dx、dy的大小是有所差别的​

一文圖解單目相機标定算法

将其進行移項,并寫為齊次的形式,有:

一文圖解單目相機标定算法

2.4 彙總

總結一下之前所說的四大坐标系的關系:

一文圖解單目相機标定算法

圖8 四大坐标系間關系

它們的公式如下:

1.世界坐标系->相機坐标系

一文圖解單目相機标定算法

2.相機坐标系->圖像坐标系​

一文圖解單目相機标定算法

3.圖像坐标系->像素坐标系

一文圖解單目相機标定算法

那麼将這些式子聯立,最終得(你可以嘗試自己去推導一下,就是幾個式子代換一下):

一文圖解單目相機标定算法

進一步化簡:

一文圖解單目相機标定算法

這個公式就是整個單目相機在理想情況下的成像公式,可以建立世界坐标系到像素坐标系的一一映射。

再補充一個知識點,歸一化平面:

歸一化平面,其實際是圖像坐标系的等比縮放,也就是當f=1的情況,主要是便于公式推導,它與圖像坐标系是等比縮放關系,隻需要乘以f即可完成互相轉換。

一文圖解單目相機标定算法

圖9 圖像坐标系與歸一化平面關系

03 相機畸變

一文圖解單目相機标定算法
一文圖解單目相機标定算法
一文圖解單目相機标定算法
一文圖解單目相機标定算法

以上是理想情況下世界坐标系到像素坐标系的轉換。而由于相機制造技術的原因,其成像過程中難免存在着畸變,在後續建構精确的三維重建算法前,我們要對相機的畸變進行矯正,以提高算法重建的精度,這一步驟才稱為相機标定。

一文圖解單目相機标定算法

3.1徑向畸變

徑向畸變原因:在相機制造過程中,很難保證鏡頭的厚度完全均勻,由于制造技術的原因,通常為這種情況為中間厚、邊緣薄,因而光線在遠離透鏡中心的地方,會發生更大程度的扭曲,這種現象在魚眼相機(桶形畸變)中尤為明顯。​

徑向畸變主要有兩種類型:枕型畸變和桶型畸變,示意圖如下:

一文圖解單目相機标定算法

圖10 相機徑向畸變

一文圖解單目相機标定算法
一文圖解單目相機标定算法

需要注意的是,這裡校正,并不是用的系數越多,整個矯正結果越精确,我們應該考慮相機的實際情況,選擇合适的參數數量。

3.2切向畸變

切向畸變原因:切向畸變産生的原因在于相機在制造過程中,成像平面與透鏡平面不平行,産生了透視變換。

一文圖解單目相機标定算法

圖11 切向畸變

這種畸變可以由以下公式描述,它也與距離圖像中心的距離半徑有關:

一文圖解單目相機标定算法
一文圖解單目相機标定算法

3.3合并考慮

将徑向畸變和切向畸變合并,隻需要将兩個畸變矯正直接加起來即可,公式如下:

一文圖解單目相機标定算法
一文圖解單目相機标定算法

合并考慮畸變原因:其實也很簡單,兩種畸變是同時發生在成像過程中的,發生的原因也是互相獨立的,而且也都是關于距離的表達式,你似乎也找不到更好的方式來綜合考慮這兩種誤差,實踐證明,這種合并考慮畸變的情況效果還不錯。

04 成像過程總結

一文圖解單目相機标定算法

我已經把所有需要記住的知識點彙聚在一張圖檔上了,請大家對照着前面的文章去了解:

一文圖解單目相機标定算法
一文圖解單目相機标定算法
一文圖解單目相機标定算法

05 思考問題

一文圖解單目相機标定算法

當看完這次推文之後,請大家在腦海裡梳理以下幾個概念:

  1. 世界坐标系、相機坐标系、圖像坐标系、像素坐标系、歸一化坐标系,它們之間的差别是什麼,怎麼進行互相轉換?
  2. 徑向畸變、切向畸變、它們的主要因素、以及如何去校正?
  3. 最好的話,你自己去畫這個圖,去推導一遍公式。雖然你後面公式會忘,但相信我,3D視覺領域好多公式,我不需要你記住它,但你要有個直覺印象,去推導一遍有助于你真正了解這個公式。

當明白了這些以後,下節課我們講,怎麼通過張正友标定法去獲得要标定的參數,标定得來的參數怎麼用,用MATALAB跟OpenCV分别去實踐,不過在此之前,你要自己思考以下這些問題:

  1. 相機标定,我們究竟要标定那些參數?
  2. 相機畸變發生在四大坐标系轉換的哪一過程?
  3. 假設我們拿到了這些參數怎麼用?
  4. 對于每個物點,在像素坐标系下都有唯一像點與之對應,那麼反過來是否成立?
  5. 怎麼去評判标定的好不好?

大家還想要我們講什麼呢?請踴躍留言!高能預警,下節課我們将以視訊的形式來講解。不過,如果你沒有好好看這個相機成像過程的文章,下節課我講的再有趣也是白扯~這裡是3D視覺工坊嘉賓,Atlas博士計算機視覺大講堂,緻力于把計算機視覺知識講得不那麼無趣!