前言
最近翻閱關(guān)于從2D視頻或者圖片中重構(gòu)3D姿態(tài)的文章及其源碼,發(fā)現(xiàn)都有關(guān)于攝像機(jī)參數(shù)的求解,查找了相關(guān)資料,做一下筆記。
國(guó)際慣例,來(lái)一波參考網(wǎng)址
透視變換、透鏡畸變及校正模型、相機(jī)校正(Camera Calibration)、Matlab相機(jī)校正工具箱、【立體視覺(jué)(一)】由基本矩陣、本質(zhì)矩陣恢復(fù)攝像機(jī)矩陣——Structure from motion、Multiple View Geometry in Computer Vision(計(jì)算機(jī)視覺(jué)中的多視角幾何),附matlab代碼?、相機(jī)矩陣的分解系列教程、攝像機(jī)矩陣詳解(中文版)
【注】本文主要提取倒數(shù)第二個(gè)大牛博客的主要內(nèi)容,最后一個(gè)博客是某位國(guó)內(nèi)大神對(duì)這位大牛博客的精解,其它部分為圖像知識(shí)的補(bǔ)充,主要來(lái)源于《OpenGL編程指南》第五章節(jié)。博客不在于深究各種細(xì)節(jié)實(shí)現(xiàn),主要在于對(duì)此知識(shí)點(diǎn)有所了解,也就是看大牛們的代碼的時(shí)候至少要知道我們需要求解的東西是什么,都包含什么參數(shù)。對(duì)理論沒(méi)興趣的可以直接看總結(jié),也可看demo展示.
基本知識(shí)復(fù)習(xí)
先看看使用相機(jī)的主要步驟:
移動(dòng)相機(jī)到拍攝位置,鏡頭對(duì)準(zhǔn)某個(gè)方向(視圖變換,view transform)
將拍攝對(duì)象一到場(chǎng)景中的某個(gè)位置(模型變換,model transform)
設(shè)置相機(jī)焦距或調(diào)整縮放比例(投影變換,projection transform)
對(duì)結(jié)果圖像拉伸或者壓縮,變換為需要的圖片大小(視口變換,viewpoint transform)
其中前兩步可以合并為一個(gè)步驟,稱(chēng)為模型-視圖變換(model-view transform),包含多級(jí)平移、旋轉(zhuǎn)、縮放。下圖摘自O(shè)penGL一書(shū),用于理解對(duì)象從一個(gè)坐標(biāo)系統(tǒng)到另一個(gè)坐標(biāo)系統(tǒng)的變換過(guò)程

齊次坐標(biāo)
先看看矩陣乘法在三維坐標(biāo)變換的缺點(diǎn):將三維坐標(biāo)視為一個(gè)列向量,那么矩陣*列向量得到的新向量的每一個(gè)分量,都是舊的列向量的線(xiàn)性函數(shù),因而三維笛卡爾坐標(biāo)與矩陣的乘法只能實(shí)現(xiàn)三維坐標(biāo)的縮放和旋轉(zhuǎn),而無(wú)法實(shí)現(xiàn)坐標(biāo)平移。?

可以發(fā)現(xiàn)將三維的笛卡爾坐標(biāo)添加一個(gè)額外坐標(biāo),就可以實(shí)現(xiàn)坐標(biāo)平移了,而且保持了三維向量與矩陣乘法具有的縮放和旋轉(zhuǎn)操作。這個(gè)就稱(chēng)為齊次坐標(biāo)。而這種變換也稱(chēng)為仿射變換(affine transformation),不屬于線(xiàn)性變換(線(xiàn)性變換的一個(gè)重要規(guī)則就是(0,0,0)(0,0,0)映射以后仍是(0,0,0)(0,0,0))。
齊次坐標(biāo)的好處也就顯而易見(jiàn)了:
進(jìn)一步完成透視變換,也可戳這里,其實(shí)第四個(gè)分量就是用于實(shí)現(xiàn)透視投影變換的,所有的分量同時(shí)處理相同值不會(huì)改變它所表達(dá)的位置。
使用線(xiàn)性變換完成模型的平移
【注意】我們經(jīng)常將第四個(gè)分量記為w,OpenGL會(huì)在顯示幾何體的時(shí)候用前三個(gè)分量除以第四個(gè)分量,從而將齊次坐標(biāo)變換為笛卡爾坐標(biāo)。當(dāng)w=0.0的時(shí)候,表示物體位于無(wú)限近的位置,透視效果就是無(wú)限大的,所以會(huì)產(chǎn)生一些無(wú)法預(yù)知的結(jié)果。而且當(dāng)w是負(fù)數(shù)的時(shí)候,雖然理論可以,但是負(fù)數(shù)w值可能會(huì)給圖形管線(xiàn)的某些環(huán)節(jié)帶來(lái)麻煩,當(dāng)與其它的正數(shù)w進(jìn)行計(jì)插值計(jì)算的時(shí)候,導(dǎo)致結(jié)果接近或等于0。避免這個(gè)問(wèn)題的方法就是保證第四個(gè)分量w為正。
相機(jī)矩陣內(nèi)參和外參的分解
何為幾何相機(jī)校正(Geometric camera calibration) ?
也稱(chēng)為相機(jī)反切(camera resectioning),主要用于估計(jì)圖像或者視頻攝像機(jī)的透鏡和圖像傳感器的相關(guān)參數(shù)。使用這些參數(shù)可以糾正透鏡畸變,度量真實(shí)世界中物體的大小,或者相機(jī)在一個(gè)場(chǎng)景中的定位。因而可以被用于機(jī)器視覺(jué),去檢測(cè)或者度量事物,也可用于機(jī)器人中,幫助導(dǎo)航系統(tǒng)和3D重建。

相機(jī)參數(shù)都有哪些?估計(jì)它們需要的條件?評(píng)估所估算的相機(jī)參數(shù)好壞的標(biāo)準(zhǔn)?
①主要包含內(nèi)參(intrinsics)、外參(extrinsics)、畸變系數(shù)(distortion coefficients)
②估計(jì)參數(shù)需要3D世界坐標(biāo)及其對(duì)應(yīng)的2D圖像點(diǎn)。比如在重構(gòu)3D姿態(tài)的時(shí)候,需要同時(shí)輸入圖片及圖片中對(duì)應(yīng)的人的骨骼2D坐標(biāo)點(diǎn)。
③評(píng)估所估計(jì)相機(jī)參數(shù)的方法就是:首先畫(huà)出相機(jī)和校準(zhǔn)模式的相對(duì)位置;隨后計(jì)算投影誤差;最后計(jì)算參數(shù)的估算誤差。在matlab中有Camera Calibrator來(lái)進(jìn)行相機(jī)校準(zhǔn)和評(píng)估參數(shù)精確度。

相機(jī)矩陣的表示?缺點(diǎn)?
假設(shè)有一個(gè)3?43?4的相機(jī)矩陣,可以將齊次3D坐標(biāo)轉(zhuǎn)換為2D圖像坐標(biāo)。矩陣表示如下?
P=[M|?MC]
這里的’||’代表的是增廣矩陣。其中MM代表可逆的3?3矩陣,C是列向量,代表世界坐標(biāo)系中相機(jī)位置。
相機(jī)矩陣可以將3D點(diǎn)投影到2D空間,但是有些缺點(diǎn):
沒(méi)有提供相機(jī)的擺放姿態(tài)
沒(méi)有聽(tīng)相機(jī)的內(nèi)部幾何特征
不能使用鏡面光照,因?yàn)闊o(wú)法在相機(jī)坐標(biāo)系中得到表面法線(xiàn)向量。
相機(jī)矩陣的分解?
相機(jī)矩陣分解
為了解決上述問(wèn)題,可以將相機(jī)矩陣分解為兩個(gè)矩陣的乘積:內(nèi)參矩陣K和外參矩陣[R|?RC]
P=K[R|?RC]
其中,3?3的上三角陣KK描述了相機(jī)的內(nèi)參比如焦距;3?3的旋轉(zhuǎn)矩陣R的列表示相機(jī)參考幀的世界坐標(biāo)軸方向;向量C是世界坐標(biāo)系中的相機(jī)中心。那么向量t=?RC就給出了相機(jī)坐標(biāo)系中的世界原點(diǎn)位置。我們需要做的就是求解這些參數(shù),當(dāng)然前提是我們已經(jīng)知道P了。
相機(jī)中心的求解比較簡(jiǎn)單,利用分解前的相機(jī)矩陣,由于P的最后一列是由?MC得到的,而MM在原始的相機(jī)矩陣的前3?3部分已經(jīng)給出了,所以只需要用?M?1左乘它即可。
首先注意旋轉(zhuǎn)矩陣R是正交的,因?yàn)槊恳涣写淼氖且粋€(gè)軸(想想三維坐標(biāo)系的xyz軸是不是垂直的);而內(nèi)參矩陣K是一個(gè)上三角陣。然后考慮到QR分解的用途就是將一個(gè)滿(mǎn)秩矩陣分解為上三角陣和正交陣的乘積。算法好像不難,matlab的寫(xiě)法如
function[R Q]=rq(M)
[Q,R]= qr(flipud(M)')
R = flipud(R');??
?R =fliplr(R);? ??
Q =Q';? ? ?
?Q =flipud(Q);
但是發(fā)現(xiàn)QR分解的結(jié)果不唯一,對(duì)K的任何一列以及R的對(duì)應(yīng)行取反(negative)都不會(huì)導(dǎo)致相機(jī)矩陣結(jié)果的改變。
如果滿(mǎn)足如下兩個(gè)條件,可以讓K的對(duì)角元為正
圖像的X/Y軸所指方向與相機(jī)的X/Y軸方向相同
相機(jī)處于z軸正方向
所以可以取QR分解中,使得KK的對(duì)角元為正的解,讓KK對(duì)角元為正的代碼如下
# make diagonal of K positive
T =diag(sign(diag(K)));
K = K * T;
R = T * R;? # (T is its own inverse)
然而在實(shí)際中,照相機(jī)和圖片的軸經(jīng)常不統(tǒng)一,所以K的對(duì)角元也不應(yīng)該是正的,如果強(qiáng)制它們?yōu)檎?,將?huì)導(dǎo)致一些不好的副作用,包含:
對(duì)象位于相機(jī)錯(cuò)誤的一邊
旋轉(zhuǎn)矩陣行列式為?1而不是1
不正確的鏡面光照(?specular lighting)
出現(xiàn)視覺(jué)幾何無(wú)法被渲染問(wèn)題,原因在于具有負(fù)的w坐標(biāo)
如果從全正的對(duì)角元開(kāi)始,你需要做的就是:
如果圖像x軸和攝像機(jī)x軸指向相反方向,將K的第一列以及R的第一行取反
如果圖像y軸和攝像機(jī)y軸指向相反方向,將K的第二列以及R的第二行取反
如果相機(jī)俯視是z軸負(fù)方向,將K的第三列以及R的第三行取反。
如果R的行列式置為?1,將它取反
以上每一步都能保證相機(jī)矩陣不變,最后一步等價(jià)于將整個(gè)相機(jī)矩陣P乘以?1。因?yàn)镻的操作是基于齊次坐標(biāo)系的,所以將它乘以任何的常量都無(wú)影響。
當(dāng)然可以使用向量t=?RC去檢查結(jié)果,此式代表的是在相機(jī)坐標(biāo)系中的世界坐標(biāo)系原點(diǎn)。如果都沒(méi)錯(cuò),那么tx,ty,tz應(yīng)該能夠反映出在世界原點(diǎn)在相機(jī)中的位置(分別指出在中心左邊/右邊,上邊/下邊,相機(jī)的前面/后面)
相機(jī)矩陣求解
前面看了如何將相機(jī)矩陣分解為內(nèi)參和外參矩陣的乘積。
相機(jī)的外參矩陣描述的是世界坐標(biāo)中相機(jī)的位置,及其指向方向。有兩個(gè)成分:旋轉(zhuǎn)矩陣R和平移向量t。它們并非恰好對(duì)應(yīng)相機(jī)的旋轉(zhuǎn)和平移。
外參矩陣以剛體變換矩陣的形式可以記為:左邊一個(gè)3?3旋轉(zhuǎn)矩陣,右邊一個(gè)3?1的平移列向量?

常見(jiàn)的做法是在底部增加一行(0,0,0,1),這使得矩陣為方形的,允許我們進(jìn)一步將矩陣分解為旋轉(zhuǎn)和平移矩陣?

這個(gè)矩陣描述的就是如何將世界坐標(biāo)系中的點(diǎn)變換都相機(jī)坐標(biāo)系中,向量tt描述的是世界坐標(biāo)系原點(diǎn)在相機(jī)坐標(biāo)系中的位置,RR的列代表的是相機(jī)坐標(biāo)系中世界坐標(biāo)系軸的方向。
從上可以發(fā)現(xiàn),外參主要作用就是描述世界坐標(biāo)系到相機(jī)坐標(biāo)系的轉(zhuǎn)換。與我們經(jīng)常想的相機(jī)坐標(biāo)系到世界坐標(biāo)系的轉(zhuǎn)換剛好相反。
如何從相機(jī)姿態(tài)中求解外參矩陣?
實(shí)際中,直接指定相機(jī)的姿態(tài)比指定世界坐標(biāo)系中的點(diǎn)如何轉(zhuǎn)換到相機(jī)坐標(biāo)系中更加自然,通過(guò)建立一個(gè)剛體變換矩陣描述相機(jī)姿態(tài),然后對(duì)其取逆即可建立相機(jī)的外參矩陣。
因而可以這樣做:定義一個(gè)描述相機(jī)中心在世界坐標(biāo)系中的位置的向量C,然后讓Rc代表相機(jī)在世界坐標(biāo)系旋轉(zhuǎn)到當(dāng)前姿態(tài)需要的旋轉(zhuǎn)矩陣。那么描述相機(jī)姿態(tài)的變換矩陣就是(Rc|C)。同樣在底部添加一個(gè)行向量(0,0,0,1),那么外參矩陣就是相機(jī)姿態(tài)矩陣的逆

倒數(shù)第三個(gè)等式變換到倒數(shù)第二個(gè)等式,使用的轉(zhuǎn)置是因?yàn)镽c是正交陣,證明戳此處?,此外,平移矩陣的逆就是他的負(fù)數(shù)平移向量,進(jìn)而可以得到外參矩陣參數(shù)和相機(jī)姿態(tài)是直接相關(guān)的:

不要混淆了世界坐標(biāo)系的變換RR和相機(jī)坐標(biāo)系的變換CC
此網(wǎng)址有demo展示。
內(nèi)參矩陣
內(nèi)參矩陣是將3D相機(jī)坐標(biāo)變換到2D齊次圖像坐標(biāo)。透視投影的一個(gè)理想模型就是針孔相機(jī)。

內(nèi)參矩陣如下?

其中每一個(gè)參數(shù)都有實(shí)際意義。
表示焦距的參數(shù):fx,fy
焦距就是真空與圖像平面(投影屏幕)的距離,類(lèi)似于人眼和視網(wǎng)膜,焦距的度量是針對(duì)像素的。針孔相機(jī)的fx,fy有相同的值。上圖中紅線(xiàn)部分就是焦距。但是在實(shí)際中,fx和fy一般不同,因?yàn)?/p>
數(shù)碼相機(jī)傳感器的缺陷
后處理中圖像被非均勻縮放
相機(jī)透鏡導(dǎo)致的無(wú)意的失真
相機(jī)使用了失真的格式,透鏡將寬屏場(chǎng)景壓縮到標(biāo)準(zhǔn)大小的傳感器中
相機(jī)校準(zhǔn)的誤差
主點(diǎn)偏移x0,y0
相機(jī)的主軸是與圖像平面垂直且穿過(guò)真空的線(xiàn),它與圖像平面的焦點(diǎn)稱(chēng)為主點(diǎn)。

主點(diǎn)偏移就是主點(diǎn)位置相對(duì)于圖像平面(投影面)的位置。上圖中,增加x0的值相當(dāng)于把針孔向右移動(dòng),等價(jià)將投影面向左移動(dòng)同時(shí)保持針孔位置不變。

軸傾斜
軸傾斜會(huì)導(dǎo)致投影圖像的形變。
焦距-從像素到世界單元
內(nèi)參矩陣只關(guān)心相機(jī)坐標(biāo)和圖像坐標(biāo)之間的關(guān)系,與相機(jī)的絕對(duì)尺寸無(wú)關(guān)。針對(duì)焦距和主點(diǎn)偏移使用響度單元可以表示相機(jī)的相對(duì)尺寸,換句話(huà)說(shuō)就是投影面的位置與其尺寸(以像素為單位)相關(guān)。
另一種說(shuō)法是內(nèi)參相機(jī)變換與相機(jī)的幾何均勻縮放無(wú)關(guān),利用像素單元表示尺寸,可以捕捉到這種不變性。
可以使用相似三角形將像素單元轉(zhuǎn)換到世界單元中,前提是你知道世界單元中至少一個(gè)相機(jī)尺寸。比如你知道相機(jī)的投影面(數(shù)字傳感器)寬度為W毫米,圖片寬度(像素為單位)為w,那就可以將焦距fx轉(zhuǎn)換為世界單元?

其它的參數(shù)fy,x0,y0也可以被轉(zhuǎn)換為對(duì)應(yīng)的世界單元Fx,X0,Y0

2D變換中的相機(jī)內(nèi)參的計(jì)算
將內(nèi)參矩陣分解為切變(shear,類(lèi)似于將長(zhǎng)方形壓成平行四邊形的變形方式)、縮放,平移變換,分別對(duì)應(yīng)軸傾斜、焦距、主點(diǎn)偏移?

第二個(gè)等式右邊三個(gè)矩陣依次是:2D平移、2D縮放、2D切變
另一種等價(jià)的分解是將切變放在縮放前面?

有一點(diǎn)需要注意:內(nèi)參不影響可見(jiàn)性——阻隔對(duì)象(occluded objects)在圖像空間中無(wú)法通過(guò)簡(jiǎn)單的2D變換顯示出來(lái)。這里的occluded objects就是那些你希望看到,但是由于某些原因看不到的對(duì)象,比如目標(biāo)跟蹤的時(shí)候,一個(gè)目標(biāo)被另一個(gè)目標(biāo)遮擋了。
總結(jié)
綜上可以發(fā)現(xiàn)相機(jī)矩陣可以通過(guò)如下方法被分解:
全相機(jī)矩陣被分解為內(nèi)參和外參矩陣
外參矩陣指示3D旋轉(zhuǎn)和平移
內(nèi)參矩陣指示2D變換
整個(gè)分解方法如下?

戳此處有交互式demo
demo中提供了三種外參接口(世界坐標(biāo)系,相機(jī)坐標(biāo)系,look-at),三種交互效果不同,前兩種的方向相反,世界坐標(biāo)系中向左移動(dòng)表示相機(jī)坐標(biāo)系中向右移動(dòng),但是它們都有六個(gè)參數(shù)控制:
tx 表示沿著水平方向移動(dòng)相機(jī)
ty表示沿著垂直方向移動(dòng)相機(jī)
tz表示沿著前后方向移動(dòng)相機(jī)
px表示鏡頭不平移,但是繞x軸做俯仰旋轉(zhuǎn)
py表示鏡頭不平移,但是繞垂直軸y軸做左右搖頭旋轉(zhuǎn)
pz表示鏡頭不平移,但是繞z軸做順時(shí)針(或者逆時(shí)針)旋轉(zhuǎn)
demo也提供了內(nèi)參的接口,包括四個(gè)參數(shù)控制:
焦距(Focal length):鏡頭的前后縮進(jìn)(不是縮放)
軸傾斜(Axis Skew):可以導(dǎo)致球變形,平面上顯示橢球形
x0表示主點(diǎn)偏移,相機(jī)不動(dòng),左右移動(dòng)成像平面
y0表示主點(diǎn)偏移,相機(jī)不動(dòng),上下移動(dòng)成像平面