相機標(biāo)定可以說是計算機視覺/機器視覺的基礎(chǔ),但是初學(xué)者不易上手,本文將給讀者整理一遍相機標(biāo)定的邏輯,并在文末回答評論區(qū)提出的問題。分為以下內(nèi)容:
相機標(biāo)定的目的和意義
相機成像過程的簡化與建模
針孔相機模型的數(shù)學(xué)描述
標(biāo)定針孔相機模型的參數(shù)
相機標(biāo)定的目的和意義
我們所處的世界是三維的,而照片是二維的,這樣我們可以把相機認(rèn)為是一個函數(shù),輸入量是一個場景,輸出量是一幅灰度圖。這個從三維到二維的過程的函數(shù)是不可逆的。

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

這個逼近的過程就是「相機標(biāo)定」,我們用簡單的數(shù)學(xué)模型來表達(dá)復(fù)雜的成像過程,并且求出成像的反過程。標(biāo)定之后的相機,可以進(jìn)行三維場景的重建,即深度的感知,這是計算機視覺的一大分支。
相機成像過程的簡化與建模
提到相機的成像,從根本上來說,就是在討論相機的鏡頭。固定結(jié)構(gòu)的相機鏡頭決定了一對固定的物像共軛關(guān)系,所謂「共軛」,意思是鏡頭前某個位置的物,它的像一定在鏡頭后的某個位置,這個關(guān)系是固定的。舉個最簡單的例子,無窮遠(yuǎn)處的物必然會在鏡頭的焦點處成像。這里說的固定結(jié)構(gòu),指的是鏡頭的焦距固定,光圈固定。

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

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

其中,
是火苗尖的物點,
是火苗尖的像點 ,
是蠟燭根的物點,
是蠟燭根的像點, ?
是等效透鏡的中心(也稱為光心),紅色虛線表達(dá)了物點 ?
到 像點
成像光路中的兩條,綠色虛線表達(dá)了物點
到像點
成像光路中的兩條,紅色是CCD面。注意,剛剛說到我們畫的是「相機拍攝到清晰的蠟燭燃燒場景的草圖」,這表明像點
和像點
剛好落在CCD面上,那么假如像點沒有落在CCD面上,也就是CCD拍攝的圖像不清晰,我們?nèi)绾未_定像點的位置?

根據(jù)幾何光學(xué)的作圖法,由過等效透鏡的焦點
的光線和過光心
的光線,我們可以作出像點
與
的位置,現(xiàn)在我們對「相機拍攝到清晰的蠟燭燃燒場景的草圖」同樣用作圖法,只考慮
與
點的物像關(guān)系。

這樣我們就能夠得到成像光路中的4條:①是過透鏡上邊沿的光路,④是過透鏡下邊沿的光路,②是過等效透鏡焦點的光路,③是過光心的光路。它們都表達(dá)了物點
與像點
的物像共軛關(guān)系,顯然③過光心的光路是最容易建立物像共軛關(guān)系數(shù)學(xué)模型,因此我們用③來代表成像光路,對相機成像過程進(jìn)行簡化。

到這里我們發(fā)現(xiàn),簡化后的相機模型和針孔相機的成像原理很相似,因此我們把簡化后的相機模型稱為針孔相機模型。上圖中的
是針孔相機模型的焦距,但請注意,此針孔相機「焦距」非彼等效透鏡「焦距」,只是借用了「焦距」匯聚光線的概念,表達(dá)的是CCD面到光心的距離。

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

所以準(zhǔn)確的講把相機的成像過程簡化成針孔相機模型,只是借用了針孔相機中簡單的數(shù)學(xué)關(guān)系來表達(dá)一些本來難以表達(dá)的數(shù)學(xué)關(guān)系,使得數(shù)學(xué)上大大降低了復(fù)雜性,但是這個簡化的代價同樣很大,它本身不考慮像差(雖然針孔相機模型補充了消畸變模型)、不考慮景深(針孔相機模型物像關(guān)系不具有一一對應(yīng)性,認(rèn)為凡是物總能成清晰像),并且假定等效透鏡是薄透鏡。所以說針孔相機模型僅僅是一種真實相機的成像過程的近似,甚至于我們可以說這是一種非常粗糙的近似,這使得這個模型對越符合針孔相機模型的真實相機近似程度越高,如網(wǎng)絡(luò)攝像頭、手機鏡頭、監(jiān)控探頭等等。
針孔相機模型的描述
我們對相機成像過程進(jìn)行簡化和建模得到了針孔相機模型,如下圖示。

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

由光心
著光軸出發(fā),像平面在
上,
是相機的物理焦距(單位:
)。
點
在空間中,在相機坐標(biāo)系下的位置是
點
在像平面上,有兩個等價的位置描述:1. 在相機坐標(biāo)系下的位置是
;2. 在CCD標(biāo)號坐標(biāo)系下的位置是
。
在無鏡頭畸變的條件下,光心
、點
與點
在一條直線上。
與
是CCD單個像素在水平和豎直兩個方向上的尺寸(單位:
/像素),因此定義焦距為
(單位:像素)。
CCD標(biāo)號坐標(biāo)系原點到光軸的偏移量為
(單位:像素)。根據(jù)相似三角形關(guān)系,可以得出:
(1) 二維CCD標(biāo)號坐標(biāo)
二維CCD像素坐標(biāo)
建立CCD像面上的點標(biāo)號坐標(biāo)與物理坐標(biāo)之間關(guān)聯(lián),由于像平面在
上,可省略。

(2) 像點的二維像素坐標(biāo)
物點的三維空間中的坐標(biāo)
建立CCD像面上像點物理坐標(biāo)與對應(yīng)的三維空間中物點坐標(biāo)之間關(guān)聯(lián)。

(3) 像點的二維CCD標(biāo)號坐標(biāo)
物點的三維空間中的坐標(biāo)
連接(1)和(2)的兩個關(guān)聯(lián),也是實際進(jìn)行標(biāo)定得到參數(shù) 

由以上三個關(guān)聯(lián)可以得到:像點標(biāo)號
像點坐標(biāo)
物點坐標(biāo)
。在OpenCV及Matlab標(biāo)定工具箱直接使用了(3)關(guān)聯(lián),不需要知道CCD單個像素的尺寸,因此在標(biāo)定過程是得不到物理焦距
的,只能得到像素焦距
。

很容易發(fā)現(xiàn),(3)關(guān)聯(lián)是不約束
的,也就是說,針孔相機模型本身是欠定的,通過被點亮的CCD像素
我們只能知道物點
在射線
上,但無法確定具體的點,所以我們講,針孔相機模型是一個射線方程模型,
點的射線方程:
以上的關(guān)系是在無鏡頭畸變的條件下建立的,但是實際上存在鏡頭畸變,可以理解成像點和物點之間的光線是彎曲的,要得到射線模型,要進(jìn)行消除畸變。

(4) 補充消畸變模型以像面中心像素坐標(biāo)
為中心,像面上的點到中心的距離為
合成畸變
其中:
徑向畸變

切向畸變

把消畸變模型補充進(jìn)針孔相機模型,因此「像點標(biāo)號
像點坐標(biāo)
物點坐標(biāo)
」被修正為:像點標(biāo)號
像點坐標(biāo)
物點坐標(biāo)
消畸變后的射線方程
是:
標(biāo)定針孔相機模型的參數(shù)
針孔相機模型中,只要確定這9個參數(shù)就可以唯一的確定針孔相機模型,
,這個過程就稱為「相機標(biāo)定」,其中前4個我們稱為內(nèi)參數(shù),后5個稱為畸變參數(shù),畸變參數(shù)是為了補充內(nèi)參的。所以一旦相機結(jié)構(gòu)固定,包括鏡頭結(jié)構(gòu)固定,對焦距離固定,我們就可以用這9個的參數(shù)去近似這個相機。這里說的「鏡頭結(jié)構(gòu)固定」,按我個人的理解,除了焦距固定之外,也應(yīng)當(dāng)包含光圈固定,因為改變光圈的大小,除了景深之外,是有可能改變針孔相機模型中的光心位置,但是影響并不是很大。這意味著標(biāo)定好的相機如果改變光圈大小,會使得標(biāo)定誤差變大但應(yīng)該不會大到難以接受的地步。對于針孔相機本身需要擬合的方程如下:

其中
代表了畸變圖像和消畸變圖像之間的變換。因此,我們現(xiàn)在的任務(wù)就是找出一大堆具有對應(yīng)關(guān)系的像點
和物點
的點對作為樣本,來訓(xùn)練出模型的9個參數(shù)
。那么這里就引發(fā)了兩個問題:(1) 這么多像點和物點到底誰和誰是一對兒?(2) 即便我知道物點在哪里,可是我怎么樣用相機坐標(biāo)系來表達(dá)物點的位置
?為了解決上述的兩個問題,標(biāo)定板應(yīng)運而生。標(biāo)定板的第一大作用,確定物點和像點的對應(yīng)性。這里用到的原理主要是「透視不變性」,打個比方,你近看一個人和遠(yuǎn)看一個人,雖然他的鼻子大小變了,你看鼻子的視角也變了,但是拓?fù)浣Y(jié)構(gòu)肯定是不變的,你也不可能把鼻子看成是嘴巴。

所以在標(biāo)定板中,印刷了拓?fù)浣Y(jié)構(gòu),廣泛應(yīng)用的是棋盤格和圓點格,這兩種之所以成為主流,不僅是因為它們的拓?fù)浣Y(jié)構(gòu)明確且均勻,更重要的是檢測其拓?fù)浣Y(jié)構(gòu)的算法簡單且有效。棋盤格檢測的是角點,只要對拍攝到的棋盤格圖像橫縱兩個方向計算梯度就可獲得;而圓點格的檢測只需要對拍攝到的圓點格圖樣計算質(zhì)心即可。假如你開發(fā)了一套非常完美的檢測人臉全部特征的算法,你完全可以用你的照片當(dāng)作標(biāo)定板。按照我的經(jīng)驗,圓點格的效果應(yīng)該是好于棋盤格,因為圓點質(zhì)心的「透視不變性」要比棋盤格的角點穩(wěn)定的多。下圖是同樣尺寸、同樣比例棋盤格和圓點在最大重投影誤差處的誤差對比,紅色十字是提取的角點/質(zhì)心,綠色圓圈是針孔相機模型計算出來認(rèn)為的角點/質(zhì)心位置。

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

但是圓點格的檢測似乎是Halcon的專利(存疑),因此OpenCV和Matlab標(biāo)定工具箱用的是棋盤格,要用圓點格得要自己寫算法。下文中提到的標(biāo)定板說的都是棋盤格。標(biāo)定板的第二大作用是把標(biāo)定板中的角點變換到相機坐標(biāo)系下的坐標(biāo)
。對于標(biāo)定的初學(xué)者來說,很容易忽略的一點是標(biāo)定板是具有標(biāo)定板坐標(biāo)系的。換句話說,標(biāo)定板中的每個角點,在標(biāo)定板坐標(biāo)系下的位置是確定并且是已知的。

而標(biāo)定板坐標(biāo)系變換到相機坐標(biāo)系的變換矩陣,我們稱它的元素為外參數(shù),所以在我眼中,相機標(biāo)定的外參根本就是標(biāo)定內(nèi)參的副產(chǎn)品,它會隨著標(biāo)定板的擺放不同而不同,由標(biāo)定板坐標(biāo)系變換到相機坐標(biāo)系的變換矩陣可以由下式表達(dá):

其中,
稱為旋轉(zhuǎn)矩陣,
稱為平移矩陣,下表
代表board to camera。注意這個坐標(biāo)系的變換是一個線形變換,反應(yīng)到物理上講,這意味者標(biāo)定板必須盡可能的平,如果標(biāo)定板不平,這個變換就不是線形的了。我們把這個變換帶到原本要擬合的方程中去:

如此一來,我們就把能夠把CCD上拍攝的到角點的像素標(biāo)號
和每一個角點已知的在標(biāo)定板坐標(biāo)系下的坐標(biāo)
對應(yīng)起來,通過各種各樣的姿態(tài)作為樣本,訓(xùn)練出全部參數(shù)
。

至于參數(shù)訓(xùn)練的方法,最小二乘,極大似然估計等等,很容易找到相關(guān)的資料,在此不再贅述。
如果用OpenCV或Matlab標(biāo)定工具箱進(jìn)行標(biāo)定,需要給出棋盤格的物理尺寸,這其實就是在建立標(biāo)定板坐標(biāo)系,從測量的角度講,標(biāo)定板的精度是相機標(biāo)定精度的基準(zhǔn),是誤差傳遞鏈上的第一個環(huán)節(jié)。所以為了使針孔相機模型更逼近真實相機,對標(biāo)定板的質(zhì)量有以下要求(按重要性順序):
標(biāo)定板的平面度高,棋盤格是直角;
標(biāo)定板每個格子尺寸的高一致性;
真實尺寸與標(biāo)稱尺寸的差異小。
-
成像
+關(guān)注
關(guān)注
3文章
307瀏覽量
31524 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4422瀏覽量
67869 -
OpenCV
+關(guān)注
關(guān)注
33文章
652瀏覽量
45107
原文標(biāo)題:相機標(biāo)定究竟在標(biāo)定什么?
文章出處:【微信號:機器視覺沙龍,微信公眾號:機器視覺沙龍】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
關(guān)于LabVIEW相機標(biāo)定的問題?。。?!求解
labview相機標(biāo)定
opencv相機標(biāo)定原理與步驟
opencv單目相機標(biāo)定例程
遺傳算法的單目相機標(biāo)定
相機標(biāo)定的邏輯和學(xué)習(xí)資料詳細(xì)概述
HALCON的3D相機標(biāo)定
相機標(biāo)定含義(解決什么是相機標(biāo)定)
如何學(xué)習(xí)相機模型與標(biāo)定?
雙目相機標(biāo)定的原理和方法
什么是相機標(biāo)定 常用相機標(biāo)定的方法
GraniStudio:相機標(biāo)定例程
相機標(biāo)定究竟在標(biāo)定什么?
評論