相機標定可以說是計算機視覺/機器視覺的基礎,但是初學者不易上手,本文將給讀者整理一遍相機標定的邏輯,并在文末回答評論區提出的問題。分為以下內容:
相機標定的目的和意義
相機成像過程的簡化與建模
針孔相機模型的數學描述
標定針孔相機模型的參數
相機標定的目的和意義
我們所處的世界是三維的,而照片是二維的,這樣我們可以把相機認為是一個函數,輸入量是一個場景,輸出量是一幅灰度圖。這個從三維到二維的過程的函數是不可逆的。
相機標定的目標是我們找一個合適的數學模型,求出這個模型的參數,這樣我們能夠近似這個三維到二維的過程,使這個三維到二維的過程的函數找到反函數。
這個逼近的過程就是「相機標定」,我們用簡單的數學模型來表達復雜的成像過程,并且求出成像的反過程。標定之后的相機,可以進行三維場景的重建,即深度的感知,這是計算機視覺的一大分支。
相機成像過程的簡化與建模
提到相機的成像,從根本上來說,就是在討論相機的鏡頭。固定結構的相機鏡頭決定了一對固定的物像共軛關系,所謂「共軛」,意思是鏡頭前某個位置的物,它的像一定在鏡頭后的某個位置,這個關系是固定的。舉個最簡單的例子,無窮遠處的物必然會在鏡頭的焦點處成像。這里說的固定結構,指的是鏡頭的焦距固定,光圈固定。
上圖是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標定工具箱進行標定,需要給出棋盤格的物理尺寸,這其實就是在建立標定板坐標系,從測量的角度講,標定板的精度是相機標定精度的基準,是誤差傳遞鏈上的第一個環節。所以為了使針孔相機模型更逼近真實相機,對標定板的質量有以下要求(按重要性順序):
標定板的平面度高,棋盤格是直角;
標定板每個格子尺寸的高一致性;
真實尺寸與標稱尺寸的差異小。
向祖師爺張正友致敬。
-
相機
+關注
關注
4文章
1369瀏覽量
53914 -
機器視覺
+關注
關注
162文章
4406瀏覽量
120734 -
計算機視覺
+關注
關注
8文章
1700瀏覽量
46128
原文標題:相機標定究竟在標定什么?
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論