1. 程式人生 > >相機標定究竟在標定什麽?[轉]

相機標定究竟在標定什麽?[轉]

text alt 訓練 機器視覺 ecc 標定 com EDA view

相機標定可以說是計算機視覺/機器視覺的基礎,但是初學者不易上手,本文將給讀者整理一遍相機標定的邏輯,並在文末回答評論區提出的問題。分為以下內容:

  1. 相機標定的目的和意義
  2. 相機成像過程的簡化與建模
  3. 針孔相機模型的數學描述
  4. 標定針孔相機模型的參數

相機標定的目的和意義

我們所處的世界是三維的,而照片是二維的,這樣我們可以把相機認為是一個函數,輸入量是一個場景,輸出量是一幅灰度圖。這個從三維到二維的過程的函數是不可逆的。

技術分享圖片

相機標定的目標是我們找一個合適的數學模型,求出這個模型的參數,這樣我們能夠近似這個三維到二維的過程,使這個三維到二維的過程的函數找到反函數。

技術分享圖片

這個逼近的過程就是「相機標定」,我們用簡單的數學模型來表達復雜的成像過程,並且求出成像的反過程。標定之後的相機,可以進行三維場景的重建,即深度的感知,這是計算機視覺的一大分支。

相機成像過程的簡化與建模

提到相機的成像,從根本上來說,就是在討論相機的鏡頭。固定結構的相機鏡頭決定了一對固定的物像共軛關系,所謂「共軛」,意思是鏡頭前某個位置的物,它的像一定在鏡頭後的某個位置,這個關系是固定的。舉個最簡單的例子,無窮遠處的物必然會在鏡頭的焦點處成像。這裏說的固定結構,指的是鏡頭的焦距固定,光圈固定。

技術分享圖片

上圖是Canon EF 85mm/F1.2L II USM,我們可以找一個與這個鏡頭具有相同的物像共軛關系的凸透鏡來等效這個鏡頭,我們把這個凸透鏡稱作等效透鏡,用朝外的雙箭頭表示,如下圖。

技術分享圖片

這裏說的等效,只是針對物像共軛關系的等效,也就是光路的等效,鏡頭中之所以用了形態各異的透鏡主要是為了消除各種各樣的像差,提高清晰度。換句話說,等效透鏡的目的絕不是為了在實際應用中取代鏡頭(畢竟一個鏡頭都好貴),只是為了幫助我們理解。這樣我們就可以畫出相機拍攝到清晰的蠟燭燃燒場景的草圖,如下圖。

技術分享圖片

其中, 技術分享圖片 是火苗尖的物點, 技術分享圖片 是火苗尖的像點 ,技術分享圖片 是蠟燭根的物點, 技術分享圖片 是蠟燭根的像點, 技術分享圖片 是等效透鏡的中心(也稱為光心),紅色虛線表達了物點 技術分享圖片 到 像點技術分享圖片 成像光路中的兩條,綠色虛線表達了物點 技術分享圖片 到像點 技術分享圖片 成像光路中的兩條,紅色是CCD面。

註意,剛剛說到我們畫的是「相機拍攝到清晰的蠟燭燃燒場景的草圖」,這表明像點 技術分享圖片 和像點 技術分享圖片 剛好落在CCD面上,那麽假如像點沒有落在CCD面上,也就是CCD拍攝的圖像不清晰,我們如何確定像點的位置?

技術分享圖片

根據幾何光學的作圖法,由過等效透鏡的焦點 技術分享圖片 的光線和過光心 技術分享圖片 的光線,我們可以作出像點 技術分享圖片技術分享圖片 的位置,現在我們對「相機拍攝到清晰的蠟燭燃燒場景的草圖」同樣用作圖法,只考慮 技術分享圖片

技術分享圖片 點的物像關系。

技術分享圖片

這樣我們就能夠得到成像光路中的4條:①是過透鏡上邊沿的光路,④是過透鏡下邊沿的光路,②是過等效透鏡焦點的光路,③是過光心的光路。它們都表達了物點 技術分享圖片 與像點 技術分享圖片 的物像共軛關系,顯然③過光心的光路是最容易建立物像共軛關系數學模型,因此我們用③來代表成像光路,對相機成像過程進行簡化。

技術分享圖片

到這裏我們發現,簡化後的相機模型和針孔相機的成像原理很相似,因此我們把簡化後的相機模型稱為針孔相機模型。上圖中的 技術分享圖片 是針孔相機模型的焦距,但請註意,此針孔相機「焦距」非彼等效透鏡「焦距」,只是借用了「焦距」匯聚光線的概念,表達的是CCD面到光心的距離。

技術分享圖片

但是我們說的是簡化後的相機模型和針孔相機的成像原理僅僅是相似,絕不能等同,由於針孔相機的原理是光沿直線傳播,所以真實的針孔相機是沒有「焦距」的概念的,也不存在像差,其物像關系不具有一一對應性,如下圖。

技術分享圖片

所以準確的講把相機的成像過程簡化成針孔相機模型,只是借用了針孔相機中簡單的數學關系來表達一些本來難以表達的數學關系,使得數學上大大降低了復雜性,但是這個簡化的代價同樣很大,它本身不考慮像差(雖然針孔相機模型補充了消畸變模型)、不考慮景深(針孔相機模型物像關系不具有一一對應性,認為凡是物總能成清晰像),並且假定等效透鏡是薄透鏡。所以說針孔相機模型僅僅是一種真實相機的成像過程的近似,甚至於我們可以說這是一種非常粗糙的近似,這使得這個模型對越符合針孔相機模型的真實相機近似程度越高,如網絡攝像頭、手機鏡頭、監控探頭等等。

針孔相機模型的描述

我們對相機成像過程進行簡化和建模得到了針孔相機模型,如下圖示。

技術分享圖片

首先建立相機坐標系,我們以光心 技術分享圖片 為坐標系的原點, 技術分享圖片技術分享圖片 方向是CCD像素排列的水平和豎直兩個方向, 技術分享圖片 方向垂直與CCD面,建立右手坐標系,這是一個三維坐標系。其次,我們還需要建立CCD標號坐標系:以CCD左上角像素標號為原點,CCD像素排列的水平和豎直兩個方向為 技術分享圖片技術分享圖片 方向,這是一個二維坐標系。為了方便描述,我們之後將把針孔相機模型對稱翻轉過來,如下圖所示,從數學的角度,它們是等價的。

技術分享圖片

  • 由光心 技術分享圖片 沿著光軸出發,像平面在 技術分享圖片 上, 技術分享圖片 是相機的物理焦距(單位: 技術分享圖片 )。
  • 技術分享圖片 在空間中,在相機坐標系下的位置是 技術分享圖片
  • 技術分享圖片 在像平面上,有兩個等價的位置描述:1. 在相機坐標系下的位置是 技術分享圖片 ;2. 在CCD標號坐標系下的位置是 技術分享圖片
  • 在無鏡頭畸變的條件下,光心 技術分享圖片 、點 技術分享圖片 與點 技術分享圖片 在一條直線上。
  • 技術分享圖片技術分享圖片 是CCD單個像素在水平和豎直兩個方向上的尺寸(單位: 技術分享圖片 /像素),因此定義焦距為 技術分享圖片 (單位:像素)。
  • CCD標號坐標系原點到光軸的偏移量為 技術分享圖片 (單位:像素)。

根據相似三角形關系,可以得出: 技術分享圖片

(1) 二維CCD標號坐標 技術分享圖片 二維CCD像素坐標 技術分享圖片

建立CCD像面上的點標號坐標與物理坐標之間關聯,由於像平面在 技術分享圖片 上,可省略。

技術分享圖片

(2) 像點的二維像素坐標 技術分享圖片 物點的三維空間中的坐標 技術分享圖片

建立CCD像面上像點物理坐標與對應的三維空間中物點坐標之間關聯。

技術分享圖片

(3) 像點的二維CCD標號坐標 技術分享圖片 物點的三維空間中的坐標 技術分享圖片

連接(1)和(2)的兩個關聯,也是實際進行標定得到參數 技術分享圖片

技術分享圖片

由以上三個關聯可以得到:像點標號 技術分享圖片 像點坐標 技術分享圖片 物點坐標 技術分享圖片

在OpenCV及Matlab標定工具箱直接使用了(3)關聯,不需要知道CCD單個像素的尺寸,因此在標定過程是得不到物理焦距 技術分享圖片 的,只能得到像素焦距 技術分享圖片

技術分享圖片

很容易發現,(3)關聯是不約束 技術分享圖片 的,也就是說,針孔相機模型本身是欠定的,通過被點亮的CCD像素 技術分享圖片 我們只能知道物點 技術分享圖片 在射線 技術分享圖片 上,但無法確定具體的點,所以我們講,針孔相機模型是一個射線方程模型, 技術分享圖片 點的射線方程:

技術分享圖片

以上的關系是在無鏡頭畸變的條件下建立的,但是實際上存在鏡頭畸變,可以理解成像點和物點之間的光線是彎曲的,要得到射線模型,要進行消除畸變。

技術分享圖片

(4) 補充消畸變模型

以像面中心像素坐標 技術分享圖片 為中心,像面上的點到中心的距離為 技術分享圖片

  • 合成畸變 技術分享圖片

其中:

  • 徑向畸變 技術分享圖片
  • 切向畸變 技術分享圖片

把消畸變模型補充進針孔相機模型,因此「像點標號 技術分享圖片 像點坐標 技術分享圖片 物點坐標 技術分享圖片 」被修正為:

像點標號 技術分享圖片 像點坐標 技術分享圖片 物點坐標 技術分享圖片

消畸變後的射線方程 技術分享圖片 是:

技術分享圖片

標定針孔相機模型的參數

針孔相機模型中,只要確定這9個參數就可以唯一的確定針孔相機模型, 技術分享圖片 ,這個過程就稱為「相機標定」,其中前4個我們稱為內參數,後5個稱為畸變參數,畸變參數是為了補充內參的。所以一旦相機結構固定,包括鏡頭結構固定,對焦距離固定,我們就可以用這9個的參數去近似這個相機。這裏說的「鏡頭結構固定」,按我個人的理解,除了焦距固定之外,也應當包含光圈固定,因為改變光圈的大小,除了景深之外,是有可能改變針孔相機模型中的光心位置,但是影響並不是很大。這意味著標定好的相機如果改變光圈大小,會使得標定誤差變大但應該不會大到難以接受的地步。

對於針孔相機本身需要擬合的方程如下:

技術分享圖片

其中 技術分享圖片 代表了畸變圖像和消畸變圖像之間的變換。

因此,我們現在的任務就是找出一大堆具有對應關系的像點 技術分享圖片 和物點 技術分享圖片 的點對作為樣本,來訓練出模型的9個參數 技術分享圖片 。那麽這裏就引發了兩個問題:(1) 這麽多像點和物點到底誰和誰是一對兒?(2) 即便我知道物點在哪裏,可是我怎麽樣用相機坐標系來表達物點的位置 技術分享圖片 ?

為了解決上述的兩個問題,標定板應運而生。標定板的第一大作用,確定物點和像點的對應性。這裏用到的原理主要是「透視不變性」,打個比方,你近看一個人和遠看一個人,雖然他的鼻子大小變了,你看鼻子的視角也變了,但是拓撲結構肯定是不變的,你也不可能把鼻子看成是嘴巴。

技術分享圖片

所以在標定板中,印刷了拓撲結構,廣泛應用的是棋盤格和圓點格,這兩種之所以成為主流,不僅是因為它們的拓撲結構明確且均勻,更重要的是檢測其拓撲結構的算法簡單且有效。棋盤格檢測的是角點,只要對拍攝到的棋盤格圖像橫縱兩個方向計算梯度就可獲得;而圓點格的檢測只需要對拍攝到的圓點格圖樣計算質心即可。假如你開發了一套非常完美的檢測人臉全部特征的算法,你完全可以用你的照片當作標定板。

按照我的經驗,圓點格的效果應該是好於棋盤格,因為圓點質心的「透視不變性」要比棋盤格的角點穩定的多。下圖是同樣尺寸、同樣比例棋盤格和圓點在最大重投影誤差處的誤差對比,紅色十字是提取的角點/質心,綠色圓圈是針孔相機模型計算出來認為的角點/質心位置。

技術分享圖片

下圖是棋盤格與圓點格的重投影誤差圖,顯然圓點格的重投影誤差的誤差空間要小。

技術分享圖片

但是圓點格的檢測似乎是Halcon的專利(存疑),因此OpenCV和Matlab標定工具箱用的是棋盤格,要用圓點格得要自己寫算法。下文中提到的標定板說的都是棋盤格。

標定板的第二大作用是把標定板中的角點變換到相機坐標系下的坐標 技術分享圖片 。對於標定的初學者來說,很容易忽略的一點是標定板是具有標定板坐標系的。換句話說,標定板中的每個角點,在標定板坐標系下的位置是確定並且是已知的。

技術分享圖片

而標定板坐標系變換到相機坐標系的變換矩陣,我們稱它的元素為外參數,所以在我眼中,相機標定的外參根本就是標定內參的副產品,它會隨著標定板的擺放不同而不同,由標定板坐標系變換到相機坐標系的變換矩陣可以由下式表達:

技術分享圖片

其中, 技術分享圖片 稱為旋轉矩陣, 技術分享圖片 稱為平移矩陣,下表 技術分享圖片 代表board to camera。註意這個坐標系的變換是一個線形變換,反應到物理上講,這意味者標定板必須盡可能的平,如果標定板不平,這個變換就不是線形的了。我們把這個變換帶到原本要擬合的方程中去:

技術分享圖片

如此一來,我們就把能夠把CCD上拍攝的到角點的像素標號 技術分享圖片 和每一個角點已知的在標定板坐標系下的坐標 技術分享圖片 對應起來,通過各種各樣的姿態作為樣本,訓練出全部參數 技術分享圖片

技術分享圖片

至於參數訓練的方法,最小二乘,極大似然估計等等,很容易找到相關的資料,在此不再贅述。在知乎站內,我推薦看這篇文章,講如何求解標定參數。【機器視覺】張氏法相機標定 - 知乎專欄

如果用OpenCV或Matlab標定工具箱進行標定,需要給出棋盤格的物理尺寸,這其實就是在建立標定板坐標系,從測量的角度講,標定板的精度是相機標定精度的基準,是誤差傳遞鏈上的第一個環節。所以為了使針孔相機模型更逼近真實相機,對標定板的質量有以下要求(按重要性順序):

  1. 標定板的平面度高,棋盤格是直角;
  2. 標定板每個格子尺寸的高一致性;
  3. 真實尺寸與標稱尺寸的差異小。

向祖師爺張正友致敬。

歡迎分享,非商業轉載註明出處。

許翔翔 復旦大學 光學工程博士 轉自知乎:https://zhuanlan.zhihu.com/p/30813733

相機標定究竟在標定什麽?[轉]