相機(jī)標(biāo)定可以說是計(jì)算機(jī)視覺/機(jī)器視覺的基礎(chǔ),但是初學(xué)者不易上手,本文將給讀者整理一遍相機(jī)標(biāo)定的邏輯,并在文末回答評論區(qū)提出的問題。分為以下內(nèi)容:
相機(jī)標(biāo)定的目的和意義
相機(jī)成像過程的簡化與建模
針孔相機(jī)模型的數(shù)學(xué)描述
標(biāo)定針孔相機(jī)模型的參數(shù)
相機(jī)標(biāo)定的目的和意義
我們所處的世界是三維的,而照片是二維的,這樣我們可以把相機(jī)認(rèn)為是一個函數(shù),輸入量是一個場景,輸出量是一幅灰度圖。這個從三維到二維的過程的函數(shù)是不可逆的。
相機(jī)標(biāo)定的目標(biāo)是我們找一個合適的數(shù)學(xué)模型,求出這個模型的參數(shù),這樣我們能夠近似這個三維到二維的過程,使這個三維到二維的過程的函數(shù)找到反函數(shù)。
這個逼近的過程就是「相機(jī)標(biāo)定」,我們用簡單的數(shù)學(xué)模型來表達(dá)復(fù)雜的成像過程,并且求出成像的反過程。標(biāo)定之后的相機(jī),可以進(jìn)行三維場景的重建,即深度的感知,這是計(jì)算機(jī)視覺的一大分支。
相機(jī)成像過程的簡化與建模
提到相機(jī)的成像,從根本上來說,就是在討論相機(jī)的鏡頭。固定結(jié)構(gòu)的相機(jī)鏡頭決定了一對固定的物像共軛關(guān)系,所謂「共軛」,意思是鏡頭前某個位置的物,它的像一定在鏡頭后的某個位置,這個關(guān)系是固定的。舉個最簡單的例子,無窮遠(yuǎn)處的物必然會在鏡頭的焦點(diǎn)處成像。這里說的固定結(jié)構(gòu),指的是鏡頭的焦距固定,光圈固定。
上圖是Canon EF 85mm/F1.2L II USM,我們可以找一個與這個鏡頭具有相同的物像共軛關(guān)系的凸透鏡來等效這個鏡頭,我們把這個凸透鏡稱作等效透鏡,用朝外的雙箭頭表示,如下圖。
這里說的等效,只是針對物像共軛關(guān)系的等效,也就是光路的等效,鏡頭中之所以用了形態(tài)各異的透鏡主要是為了消除各種各樣的像差,提高清晰度。換句話說,等效透鏡的目的絕不是為了在實(shí)際應(yīng)用中取代鏡頭(畢竟一個鏡頭都好貴),只是為了幫助我們理解。這樣我們就可以畫出相機(jī)拍攝到清晰的蠟燭燃燒場景的草圖,如下圖。
其中, 是火苗尖的物點(diǎn), 是火苗尖的像點(diǎn) , 是蠟燭根的物點(diǎn),是蠟燭根的像點(diǎn), ?是等效透鏡的中心(也稱為光心),紅色虛線表達(dá)了物點(diǎn) ?到 像點(diǎn)成像光路中的兩條,綠色虛線表達(dá)了物點(diǎn) 到像點(diǎn) 成像光路中的兩條,紅色是CCD面。注意,剛剛說到我們畫的是「相機(jī)拍攝到清晰的蠟燭燃燒場景的草圖」,這表明像點(diǎn) 和像點(diǎn) 剛好落在CCD面上,那么假如像點(diǎn)沒有落在CCD面上,也就是CCD拍攝的圖像不清晰,我們?nèi)绾未_定像點(diǎn)的位置?
根據(jù)幾何光學(xué)的作圖法,由過等效透鏡的焦點(diǎn) 的光線和過光心 的光線,我們可以作出像點(diǎn) 與 的位置,現(xiàn)在我們對「相機(jī)拍攝到清晰的蠟燭燃燒場景的草圖」同樣用作圖法,只考慮 與 點(diǎn)的物像關(guān)系。
這樣我們就能夠得到成像光路中的4條:①是過透鏡上邊沿的光路,④是過透鏡下邊沿的光路,②是過等效透鏡焦點(diǎn)的光路,③是過光心的光路。它們都表達(dá)了物點(diǎn) 與像點(diǎn) 的物像共軛關(guān)系,顯然③過光心的光路是最容易建立物像共軛關(guān)系數(shù)學(xué)模型,因此我們用③來代表成像光路,對相機(jī)成像過程進(jìn)行簡化。
到這里我們發(fā)現(xiàn),簡化后的相機(jī)模型和針孔相機(jī)的成像原理很相似,因此我們把簡化后的相機(jī)模型稱為針孔相機(jī)模型。上圖中的 是針孔相機(jī)模型的焦距,但請注意,此針孔相機(jī)「焦距」非彼等效透鏡「焦距」,只是借用了「焦距」匯聚光線的概念,表達(dá)的是CCD面到光心的距離。
但是我們說的是簡化后的相機(jī)模型和針孔相機(jī)的成像原理僅僅是相似,絕不能等同,由于針孔相機(jī)的原理是光沿直線傳播,所以真實(shí)的針孔相機(jī)是沒有「焦距」的概念的,也不存在像差,其物像關(guān)系不具有一一對應(yīng)性,如下圖。
所以準(zhǔn)確的講把相機(jī)的成像過程簡化成針孔相機(jī)模型,只是借用了針孔相機(jī)中簡單的數(shù)學(xué)關(guān)系來表達(dá)一些本來難以表達(dá)的數(shù)學(xué)關(guān)系,使得數(shù)學(xué)上大大降低了復(fù)雜性,但是這個簡化的代價同樣很大,它本身不考慮像差(雖然針孔相機(jī)模型補(bǔ)充了消畸變模型)、不考慮景深(針孔相機(jī)模型物像關(guān)系不具有一一對應(yīng)性,認(rèn)為凡是物總能成清晰像),并且假定等效透鏡是薄透鏡。所以說針孔相機(jī)模型僅僅是一種真實(shí)相機(jī)的成像過程的近似,甚至于我們可以說這是一種非常粗糙的近似,這使得這個模型對越符合針孔相機(jī)模型的真實(shí)相機(jī)近似程度越高,如網(wǎng)絡(luò)攝像頭、手機(jī)鏡頭、監(jiān)控探頭等等。
針孔相機(jī)模型的描述
我們對相機(jī)成像過程進(jìn)行簡化和建模得到了針孔相機(jī)模型,如下圖示。
首先建立相機(jī)坐標(biāo)系,我們以光心 為坐標(biāo)系的原點(diǎn), 與 方向是CCD像素排列的水平和豎直兩個方向, 方向垂直與CCD面,建立右手坐標(biāo)系,這是一個三維坐標(biāo)系。其次,我們還需要建立CCD標(biāo)號坐標(biāo)系:以CCD左上角像素標(biāo)號為原點(diǎn),CCD像素排列的水平和豎直兩個方向?yàn)?與 方向,這是一個二維坐標(biāo)系。為了方便描述,我們之后將把針孔相機(jī)模型對稱翻轉(zhuǎn)過來,如下圖所示,從數(shù)學(xué)的角度,它們是等價的。
由光心 著光軸出發(fā),像平面在 上, 是相機(jī)的物理焦距(單位:)。
點(diǎn) 在空間中,在相機(jī)坐標(biāo)系下的位置是
點(diǎn) 在像平面上,有兩個等價的位置描述:1. 在相機(jī)坐標(biāo)系下的位置是 ;2. 在CCD標(biāo)號坐標(biāo)系下的位置是 。
在無鏡頭畸變的條件下,光心 、點(diǎn) 與點(diǎn) 在一條直線上。
與 是CCD單個像素在水平和豎直兩個方向上的尺寸(單位:/像素),因此定義焦距為 (單位:像素)。
CCD標(biāo)號坐標(biāo)系原點(diǎn)到光軸的偏移量為 (單位:像素)。根據(jù)相似三角形關(guān)系,可以得出:(1) 二維CCD標(biāo)號坐標(biāo) 二維CCD像素坐標(biāo) 建立CCD像面上的點(diǎn)標(biāo)號坐標(biāo)與物理坐標(biāo)之間關(guān)聯(lián),由于像平面在 上,可省略。
(2) 像點(diǎn)的二維像素坐標(biāo) 物點(diǎn)的三維空間中的坐標(biāo) 建立CCD像面上像點(diǎn)物理坐標(biāo)與對應(yīng)的三維空間中物點(diǎn)坐標(biāo)之間關(guān)聯(lián)。
(3) 像點(diǎn)的二維CCD標(biāo)號坐標(biāo) 物點(diǎn)的三維空間中的坐標(biāo) 連接(1)和(2)的兩個關(guān)聯(lián),也是實(shí)際進(jìn)行標(biāo)定得到參數(shù)
由以上三個關(guān)聯(lián)可以得到:像點(diǎn)標(biāo)號 像點(diǎn)坐標(biāo) 物點(diǎn)坐標(biāo) 。在OpenCV及Matlab標(biāo)定工具箱直接使用了(3)關(guān)聯(lián),不需要知道CCD單個像素的尺寸,因此在標(biāo)定過程是得不到物理焦距 的,只能得到像素焦距 。
很容易發(fā)現(xiàn),(3)關(guān)聯(lián)是不約束 的,也就是說,針孔相機(jī)模型本身是欠定的,通過被點(diǎn)亮的CCD像素 我們只能知道物點(diǎn) 在射線 上,但無法確定具體的點(diǎn),所以我們講,針孔相機(jī)模型是一個射線方程模型, 點(diǎn)的射線方程:以上的關(guān)系是在無鏡頭畸變的條件下建立的,但是實(shí)際上存在鏡頭畸變,可以理解成像點(diǎn)和物點(diǎn)之間的光線是彎曲的,要得到射線模型,要進(jìn)行消除畸變。
(4) 補(bǔ)充消畸變模型以像面中心像素坐標(biāo) 為中心,像面上的點(diǎn)到中心的距離為
合成畸變 其中:
徑向畸變
切向畸變
把消畸變模型補(bǔ)充進(jìn)針孔相機(jī)模型,因此「像點(diǎn)標(biāo)號 像點(diǎn)坐標(biāo) 物點(diǎn)坐標(biāo) 」被修正為:像點(diǎn)標(biāo)號 像點(diǎn)坐標(biāo) 物點(diǎn)坐標(biāo) 消畸變后的射線方程 是:
標(biāo)定針孔相機(jī)模型的參數(shù)
針孔相機(jī)模型中,只要確定這9個參數(shù)就可以唯一的確定針孔相機(jī)模型, ,這個過程就稱為「相機(jī)標(biāo)定」,其中前4個我們稱為內(nèi)參數(shù),后5個稱為畸變參數(shù),畸變參數(shù)是為了補(bǔ)充內(nèi)參的。所以一旦相機(jī)結(jié)構(gòu)固定,包括鏡頭結(jié)構(gòu)固定,對焦距離固定,我們就可以用這9個的參數(shù)去近似這個相機(jī)。這里說的「鏡頭結(jié)構(gòu)固定」,按我個人的理解,除了焦距固定之外,也應(yīng)當(dāng)包含光圈固定,因?yàn)楦淖児馊Φ拇笮?,除了景深之外,是有可能改變針孔相機(jī)模型中的光心位置,但是影響并不是很大。這意味著標(biāo)定好的相機(jī)如果改變光圈大小,會使得標(biāo)定誤差變大但應(yīng)該不會大到難以接受的地步。對于針孔相機(jī)本身需要擬合的方程如下:
其中 代表了畸變圖像和消畸變圖像之間的變換。因此,我們現(xiàn)在的任務(wù)就是找出一大堆具有對應(yīng)關(guān)系的像點(diǎn) 和物點(diǎn) 的點(diǎn)對作為樣本,來訓(xùn)練出模型的9個參數(shù) 。那么這里就引發(fā)了兩個問題:(1) 這么多像點(diǎn)和物點(diǎn)到底誰和誰是一對兒?(2) 即便我知道物點(diǎn)在哪里,可是我怎么樣用相機(jī)坐標(biāo)系來表達(dá)物點(diǎn)的位置 ?為了解決上述的兩個問題,標(biāo)定板應(yīng)運(yùn)而生。標(biāo)定板的第一大作用,確定物點(diǎn)和像點(diǎn)的對應(yīng)性。這里用到的原理主要是「透視不變性」,打個比方,你近看一個人和遠(yuǎn)看一個人,雖然他的鼻子大小變了,你看鼻子的視角也變了,但是拓?fù)浣Y(jié)構(gòu)肯定是不變的,你也不可能把鼻子看成是嘴巴。
所以在標(biāo)定板中,印刷了拓?fù)浣Y(jié)構(gòu),廣泛應(yīng)用的是棋盤格和圓點(diǎn)格,這兩種之所以成為主流,不僅是因?yàn)樗鼈兊耐負(fù)浣Y(jié)構(gòu)明確且均勻,更重要的是檢測其拓?fù)浣Y(jié)構(gòu)的算法簡單且有效。棋盤格檢測的是角點(diǎn),只要對拍攝到的棋盤格圖像橫縱兩個方向計(jì)算梯度就可獲得;而圓點(diǎn)格的檢測只需要對拍攝到的圓點(diǎn)格圖樣計(jì)算質(zhì)心即可。假如你開發(fā)了一套非常完美的檢測人臉全部特征的算法,你完全可以用你的照片當(dāng)作標(biāo)定板。按照我的經(jīng)驗(yàn),圓點(diǎn)格的效果應(yīng)該是好于棋盤格,因?yàn)閳A點(diǎn)質(zhì)心的「透視不變性」要比棋盤格的角點(diǎn)穩(wěn)定的多。下圖是同樣尺寸、同樣比例棋盤格和圓點(diǎn)在最大重投影誤差處的誤差對比,紅色十字是提取的角點(diǎn)/質(zhì)心,綠色圓圈是針孔相機(jī)模型計(jì)算出來認(rèn)為的角點(diǎn)/質(zhì)心位置。
下圖是棋盤格與圓點(diǎn)格的重投影誤差圖,顯然圓點(diǎn)格的重投影誤差的誤差空間要小。
但是圓點(diǎn)格的檢測似乎是Halcon的專利(存疑),因此OpenCV和Matlab標(biāo)定工具箱用的是棋盤格,要用圓點(diǎn)格得要自己寫算法。下文中提到的標(biāo)定板說的都是棋盤格。標(biāo)定板的第二大作用是把標(biāo)定板中的角點(diǎn)變換到相機(jī)坐標(biāo)系下的坐標(biāo) 。對于標(biāo)定的初學(xué)者來說,很容易忽略的一點(diǎn)是標(biāo)定板是具有標(biāo)定板坐標(biāo)系的。換句話說,標(biāo)定板中的每個角點(diǎn),在標(biāo)定板坐標(biāo)系下的位置是確定并且是已知的。
而標(biāo)定板坐標(biāo)系變換到相機(jī)坐標(biāo)系的變換矩陣,我們稱它的元素為外參數(shù),所以在我眼中,相機(jī)標(biāo)定的外參根本就是標(biāo)定內(nèi)參的副產(chǎn)品,它會隨著標(biāo)定板的擺放不同而不同,由標(biāo)定板坐標(biāo)系變換到相機(jī)坐標(biāo)系的變換矩陣可以由下式表達(dá):
其中, 稱為旋轉(zhuǎn)矩陣, 稱為平移矩陣,下表 代表board to camera。注意這個坐標(biāo)系的變換是一個線形變換,反應(yīng)到物理上講,這意味者標(biāo)定板必須盡可能的平,如果標(biāo)定板不平,這個變換就不是線形的了。我們把這個變換帶到原本要擬合的方程中去:
如此一來,我們就把能夠把CCD上拍攝的到角點(diǎn)的像素標(biāo)號 和每一個角點(diǎn)已知的在標(biāo)定板坐標(biāo)系下的坐標(biāo) 對應(yīng)起來,通過各種各樣的姿態(tài)作為樣本,訓(xùn)練出全部參數(shù) 。
至于參數(shù)訓(xùn)練的方法,最小二乘,極大似然估計(jì)等等,很容易找到相關(guān)的資料,在此不再贅述。
如果用OpenCV或Matlab標(biāo)定工具箱進(jìn)行標(biāo)定,需要給出棋盤格的物理尺寸,這其實(shí)就是在建立標(biāo)定板坐標(biāo)系,從測量的角度講,標(biāo)定板的精度是相機(jī)標(biāo)定精度的基準(zhǔn),是誤差傳遞鏈上的第一個環(huán)節(jié)。所以為了使針孔相機(jī)模型更逼近真實(shí)相機(jī),對標(biāo)定板的質(zhì)量有以下要求(按重要性順序):
標(biāo)定板的平面度高,棋盤格是直角;
標(biāo)定板每個格子尺寸的高一致性;
真實(shí)尺寸與標(biāo)稱尺寸的差異小。
-
成像
+關(guān)注
關(guān)注
2文章
232瀏覽量
30475 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4327瀏覽量
62569 -
OpenCV
+關(guān)注
關(guān)注
31文章
634瀏覽量
41337
原文標(biāo)題:相機(jī)標(biāo)定究竟在標(biāo)定什么?
文章出處:【微信號:機(jī)器視覺沙龍,微信公眾號:機(jī)器視覺沙龍】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論