相机矩阵(Camera Matrix)
前言
最近翻閱關(guān)于從2D視頻或者圖片中重構(gòu)3D姿態(tài)的文章及其源碼,發(fā)現(xiàn)都有關(guān)于攝像機(jī)參數(shù)的求解,查找了相關(guān)資料,做一下筆記。
國際慣例,來一波參考網(wǎng)址
透視變換、透鏡畸變及校正模型、相機(jī)校正(Camera Calibration)、Matlab相機(jī)校正工具箱、【立體視覺(一)】由基本矩陣、本質(zhì)矩陣恢復(fù)攝像機(jī)矩陣——Structure from motion、Multiple View Geometry in Computer Vision(計(jì)算機(jī)視覺中的多視角幾何),附matlab代碼 、相機(jī)矩陣的分解系列教程、攝像機(jī)矩陣詳解(中文版)
【注】本文主要提取倒數(shù)第二個(gè)大牛博客的主要內(nèi)容,最后一個(gè)博客是某位國內(nèi)大神對這位大牛博客的精解,其它部分為圖像知識的補(bǔ)充,主要來源于《OpenGL編程指南》第五章節(jié)。博客不在于深究各種細(xì)節(jié)實(shí)現(xiàn),主要在于對此知識點(diǎn)有所了解,也就是看大牛們的代碼的時(shí)候至少要知道我們需要求解的東西是什么,都包含什么參數(shù)。對理論沒興趣的可以直接看總結(jié),也可看demo展示.
基本知識復(fù)習(xí)
相機(jī)模型
先看看使用相機(jī)的主要步驟:
- 移動(dòng)相機(jī)到拍攝位置,鏡頭對準(zhǔn)某個(gè)方向(視圖變換,view transform)
- 將拍攝對象一到場景中的某個(gè)位置(模型變換,model transform)
- 設(shè)置相機(jī)焦距或調(diào)整縮放比例(投影變換,projection transform)
- 對結(jié)果圖像拉伸或者壓縮,變換為需要的圖片大小(視口變換,viewpoint transform)
其中前兩步可以合并為一個(gè)步驟,稱為模型-視圖變換(model-view transform),包含多級平移、旋轉(zhuǎn)、縮放。下圖摘自O(shè)penGL一書,用于理解對象從一個(gè)坐標(biāo)系統(tǒng)到另一個(gè)坐標(biāo)系統(tǒng)的變換過程
齊次坐標(biāo)
先看看矩陣乘法在三維坐標(biāo)變換的缺點(diǎn):將三維坐標(biāo)視為一個(gè)列向量,那么矩陣*列向量得到的新向量的每一個(gè)分量,都是舊的列向量的線性函數(shù),因而三維笛卡爾坐標(biāo)與矩陣的乘法只能實(shí)現(xiàn)三維坐標(biāo)的縮放和旋轉(zhuǎn),而無法實(shí)現(xiàn)坐標(biāo)平移。
[100002010][xyz]=[x2zy]\begin{bmatrix} 1&0&0\\ 0&0&2\\ 0&1&0 \end{bmatrix} \begin{bmatrix} x\\y\\z \end{bmatrix}= \begin{bmatrix} x\\2z\\y \end{bmatrix} ???100?001?020???????xyz????=???x2zy????
[1000002001030001][xyz1]=[x2zy+31]\begin{bmatrix} 1&0&0&0\\ 0&0&2&0\\ 0&1&0&3\\ 0&0&0&1 \end{bmatrix} \begin{bmatrix} x\\y\\z\\1 \end{bmatrix}= \begin{bmatrix} x\\2z\\y+3\\1 \end{bmatrix} ?????1000?0010?0200?0031???????????xyz1??????=?????x2zy+31??????
可以發(fā)現(xiàn)將三維的笛卡爾坐標(biāo)添加一個(gè)額外坐標(biāo),就可以實(shí)現(xiàn)坐標(biāo)平移了,而且保持了三維向量與矩陣乘法具有的縮放和旋轉(zhuǎn)操作。這個(gè)就稱為齊次坐標(biāo)。而這種變換也稱為仿射變換(affine transformation),不屬于線性變換(線性變換的一個(gè)重要規(guī)則就是(0,0,0)(0,0,0)(0,0,0)映射以后仍是(0,0,0)(0,0,0)(0,0,0))。
齊次坐標(biāo)的好處也就顯而易見了:
- 進(jìn)一步完成透視變換,也可戳這里,其實(shí)第四個(gè)分量就是用于實(shí)現(xiàn)透視投影變換的,所有的分量同時(shí)處理相同值不會(huì)改變它所表達(dá)的位置。
- 使用線性變換完成模型的平移
【注意】我們經(jīng)常將第四個(gè)分量記為www,OpenGL會(huì)在顯示幾何體的時(shí)候用前三個(gè)分量除以第四個(gè)分量,從而將齊次坐標(biāo)變換為笛卡爾坐標(biāo)。當(dāng)w=0.0w=0.0w=0.0的時(shí)候,表示物體位于無限近的位置,透視效果就是無限大的,所以會(huì)產(chǎn)生一些無法預(yù)知的結(jié)果。而且當(dāng)www是負(fù)數(shù)的時(shí)候,雖然理論可以,但是負(fù)數(shù)www值可能會(huì)給圖形管線的某些環(huán)節(jié)帶來麻煩,當(dāng)與其它的正數(shù)www進(jìn)行計(jì)插值計(jì)算的時(shí)候,導(dǎo)致結(jié)果接近或等于0。避免這個(gè)問題的方法就是保證第四個(gè)分量www為正。
相機(jī)矩陣內(nèi)參和外參的分解
相機(jī)矩陣
-
何為幾何相機(jī)校正(Geometric camera calibration) ?
也稱為相機(jī)反切(camera resectioning),主要用于估計(jì)圖像或者視頻攝像機(jī)的透鏡和圖像傳感器的相關(guān)參數(shù)。使用這些參數(shù)可以糾正透鏡畸變,度量真實(shí)世界中物體的大小,或者相機(jī)在一個(gè)場景中的定位。因而可以被用于機(jī)器視覺,去檢測或者度量事物,也可用于機(jī)器人中,幫助導(dǎo)航系統(tǒng)和3D重建。
-
相機(jī)參數(shù)都有哪些?估計(jì)它們需要的條件?評估所估算的相機(jī)參數(shù)好壞的標(biāo)準(zhǔn)?
①主要包含內(nèi)參(intrinsics)、外參(extrinsics)、畸變系數(shù)(distortion coefficients)
②估計(jì)參數(shù)需要3D世界坐標(biāo)及其對應(yīng)的2D圖像點(diǎn)。比如在重構(gòu)3D姿態(tài)的時(shí)候,需要同時(shí)輸入圖片及圖片中對應(yīng)的人的骨骼2D坐標(biāo)點(diǎn)。
③評估所估計(jì)相機(jī)參數(shù)的方法就是:首先畫出相機(jī)和校準(zhǔn)模式的相對位置;隨后計(jì)算投影誤差;最后計(jì)算參數(shù)的估算誤差。在matlab中有Camera Calibrator來進(jìn)行相機(jī)校準(zhǔn)和評估參數(shù)精確度。
圖片代碼來源:戳這里1、戳這里2
-
相機(jī)矩陣的表示?缺點(diǎn)?
假設(shè)有一個(gè)3?43*43?4的相機(jī)矩陣,可以將齊次3D坐標(biāo)轉(zhuǎn)換為2D圖像坐標(biāo)。矩陣表示如下
P=[M∣?MC]P=[M|-MC] P=[M∣?MC]
這里的’∣|∣'代表的是增廣矩陣。其中MMM代表可逆的3?33*33?3矩陣,CCC是列向量,代表世界坐標(biāo)系中相機(jī)位置。相機(jī)矩陣可以將3D點(diǎn)投影到2D空間,但是有些缺點(diǎn):
-
沒有提供相機(jī)的擺放姿態(tài)
-
沒有提供相機(jī)的內(nèi)部幾何特征
-
不能使用鏡面光照,因?yàn)闊o法在相機(jī)坐標(biāo)系中得到表面法線向量。
?
-
相機(jī)矩陣分解
為了解決上述問題,可以將相機(jī)矩陣分解為兩個(gè)矩陣的乘積:內(nèi)參矩陣KKK和外參矩陣[R∣?RC][R|-RC][R∣?RC]
P=K[R∣?RC]P=K[R|-RC] P=K[R∣?RC]
其中,3?33*33?3的上三角陣KKK描述了相機(jī)的內(nèi)參比如焦距;3?33*33?3的旋轉(zhuǎn)矩陣RRR的列表示相機(jī)參考幀的世界坐標(biāo)軸方向;向量CCC是世界坐標(biāo)系中的相機(jī)中心。那么向量t=?RCt=-RCt=?RC就給出了相機(jī)坐標(biāo)系中的世界原點(diǎn)位置。我們需要做的就是求解這些參數(shù),當(dāng)然前提是我們已經(jīng)知道PPP了。
相機(jī)中心
相機(jī)中心的求解比較簡單,利用分解前的相機(jī)矩陣,由于PPP的最后一列是由?MC-MC?MC得到的,而MMM在原始的相機(jī)矩陣的前3?33*33?3部分已經(jīng)給出了,所以只需要用?M?1-M^{-1}?M?1左乘它即可。
旋轉(zhuǎn)矩陣和內(nèi)參
首先注意旋轉(zhuǎn)矩陣R是正交的,因?yàn)槊恳涣写淼氖且粋€(gè)軸(想想三維坐標(biāo)系的xyz軸是不是垂直的);而內(nèi)參矩陣KKK是一個(gè)上三角陣。然后考慮到QRQRQR分解的用途就是將一個(gè)滿秩矩陣分解為上三角陣和正交陣的乘積。算法好像不難,matlab的寫法如下
function [R Q] = rq(M)[Q,R] = qr(flipud(M)')R = flipud(R');R = fliplr(R);Q = Q'; Q = flipud(Q);但是發(fā)現(xiàn)QRQRQR分解的結(jié)果不唯一,對KKK的任何一列以及RRR的對應(yīng)行取反(negative)都不會(huì)導(dǎo)致相機(jī)矩陣結(jié)果的改變。
如果滿足如下兩個(gè)條件,可以讓KKK的對角元為正
- 圖像的X/Y軸所指方向與相機(jī)的X/Y軸方向相同
- 相機(jī)處于z軸正方向
所以可以取QR分解中,使得KKK的對角元為正的解,讓KKK對角元為正的代碼如下
# 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)一,所以KKK的對角元也不應(yīng)該是正的,如果強(qiáng)制它們?yōu)檎?#xff0c;將會(huì)導(dǎo)致一些不好的副作用,包含:
- 對象位于相機(jī)錯(cuò)誤的一邊
- 旋轉(zhuǎn)矩陣行列式為?1-1?1而不是111
- 不正確的鏡面光照( specular lighting)
- 出現(xiàn)視覺幾何無法被渲染問題,原因在于具有負(fù)的w坐標(biāo)
如果從全正的對角元開始,你需要做的就是:
- 如果圖像x軸和攝像機(jī)x軸指向相反方向,將KKK的第一列以及RRR的第一行取反
- 如果圖像y軸和攝像機(jī)y軸指向相反方向,將KKK的第二列以及RRR的第二行取反
- 如果相機(jī)俯視是z軸負(fù)方向,將KKK的第三列以及RRR的第三行取反。
- 如果RRR的行列式置為?1-1?1,將它取反
以上每一步都能保證相機(jī)矩陣不變,最后一步等價(jià)于將整個(gè)相機(jī)矩陣PPP乘以?1-1?1。因?yàn)?span id="ozvdkddzhkzd" class="katex--inline">PPP的操作是基于齊次坐標(biāo)系的,所以將它乘以任何的常量都無影響。
當(dāng)然可以使用向量t=?RCt=-RCt=?RC去檢查結(jié)果,此式代表的是在相機(jī)坐標(biāo)系中的世界坐標(biāo)系原點(diǎn)。如果都沒錯(cuò),那么tx,ty,tzt_x,t_y,t_ztx?,ty?,tz?應(yīng)該能夠反映出在世界原點(diǎn)在相機(jī)中的位置(分別指出在中心左邊/右邊,上邊/下邊,相機(jī)的前面/后面)
相機(jī)矩陣求解
前面看了如何將相機(jī)矩陣分解為內(nèi)參和外參矩陣的乘積。
外參矩陣
相機(jī)的外參矩陣描述的是世界坐標(biāo)中相機(jī)的位置,及其指向方向。有兩個(gè)成分:旋轉(zhuǎn)矩陣RRR和平移向量ttt。它們并非恰好對應(yīng)相機(jī)的旋轉(zhuǎn)和平移。
外參矩陣以剛體變換矩陣的形式可以記為:左邊一個(gè)3?33*33?3旋轉(zhuǎn)矩陣,右邊一個(gè)3?13*13?1的平移列向量
[R∣t]=[r1,1r1,2r1,3∣t1r2,1r2,2r2,3∣t2r3,1r3,2r3,3∣t3][R|t]=\begin{bmatrix} r_{1,1}&r_{1,2}&r_{1,3}&|&t_1\\ r_{2,1}&r_{2,2}&r_{2,3}&|&t_2\\ r_{3,1}&r_{3,2}&r_{3,3}&|&t_3 \end{bmatrix} [R∣t]=???r1,1?r2,1?r3,1??r1,2?r2,2?r3,2??r1,3?r2,3?r3,3??∣∣∣?t1?t2?t3?????
常見的做法是在底部增加一行(0,0,0,1)(0,0,0,1)(0,0,0,1),這使得矩陣為方形的,允許我們進(jìn)一步將矩陣分解為旋轉(zhuǎn)和平移矩陣
[Rt01]=[It01]×[R001][100t1010t2001t30001]×[r1,1r1,2r1,30r2,1r2,2r2,30r3,1r3,2r3,300001]\begin{bmatrix} R&t \\ 0&1 \end{bmatrix}= \begin{bmatrix} I&t \\ 0&1 \end{bmatrix}\times \begin{bmatrix} R&0\\0&1 \end{bmatrix} \begin{bmatrix} 1&0&0&t_1\\ 0&1&0&t_2\\ 0&0&1&t_3\\ 0&0&0&1 \end{bmatrix}\times \begin{bmatrix} r_{1,1}&r_{1,2}&r_{1,3}&0\\ r_{2,1}&r_{2,2}&r_{2,3}&0\\ r_{3,1}&r_{3,2}&r_{3,3}&0\\ 0&0&0&1 \end{bmatrix} [R0?t1?]=[I0?t1?]×[R0?01?]?????1000?0100?0010?t1?t2?t3?1??????×?????r1,1?r2,1?r3,1?0?r1,2?r2,2?r3,2?0?r1,3?r2,3?r3,3?0?0001??????
這個(gè)矩陣描述的就是如何將世界坐標(biāo)系中的點(diǎn)變換都相機(jī)坐標(biāo)系中,向量ttt描述的是世界坐標(biāo)系原點(diǎn)在相機(jī)坐標(biāo)系中的位置,RRR的列代表的是相機(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)系中更加自然,通過建立一個(gè)剛體變換矩陣描述相機(jī)姿態(tài),然后對其取逆即可建立相機(jī)的外參矩陣。
-----更新日志:2020-6-29------
解釋一下內(nèi)參矩陣的R和下面的相機(jī)姿態(tài)RcR_cRc?的區(qū)別:
- R代表相機(jī)坐標(biāo)系中世界坐標(biāo)系軸向,也就是當(dāng)前的世界坐標(biāo)的變換需要變換到相機(jī)坐標(biāo)系中,即所謂的世界坐標(biāo)中的變換相對于相機(jī)坐標(biāo)系是怎樣的,原話為:
- RcR_cRc?代表世界坐標(biāo)系中相機(jī)坐標(biāo)系的軸向,也就是當(dāng)前的相機(jī)坐標(biāo)系需要怎么變換到世界坐標(biāo)系中,即所謂的相機(jī)坐標(biāo)系中的變換相對于世界坐標(biāo)系是怎樣的,原話為:
因而可以這樣做:定義一個(gè)描述相機(jī)中心在世界坐標(biāo)系中的位置的向量CCC,然后讓RcR_cRc?代表相機(jī)在世界坐標(biāo)系旋轉(zhuǎn)到當(dāng)前姿態(tài)需要的旋轉(zhuǎn)矩陣。那么描述相機(jī)姿態(tài)的變換矩陣就是(Rc∣C)(R_c|C)(Rc?∣C)。同樣在底部添加一個(gè)行向量(0,0,0,1)(0,0,0,1)(0,0,0,1),那么外參矩陣就是相機(jī)姿態(tài)矩陣的逆
[Rt01]=[RcC01]?1=[[IC01][Rc001]]?1=[Rc001]?1[IC01]?1=[RcT001][I?C01]=[RTc?RcTC01]\begin{aligned} \begin{bmatrix} R&t\\ 0&1 \end{bmatrix}&= \begin{bmatrix} R_c&C\\ 0&1 \end{bmatrix}^{-1}\\ &=\begin{bmatrix} \begin{bmatrix} I&C\\0&1 \end{bmatrix} \begin{bmatrix} R_c&0\\0&1 \end{bmatrix} \end{bmatrix}^{-1}\\ &= \begin{bmatrix} R_c&0\\0&1 \end{bmatrix}^{-1} \begin{bmatrix} I&C\\0&1 \end{bmatrix}^{-1}\\ &=\begin{bmatrix} R^T_c&0\\0&1 \end{bmatrix} \begin{bmatrix} I &-C\\0&1 \end{bmatrix}\\ &=\begin{bmatrix} R_T^c &- R_c^T C\\0&1 \end{bmatrix} \end{aligned} [R0?t1?]?=[Rc?0?C1?]?1=[[I0?C1?][Rc?0?01?]?]?1=[Rc?0?01?]?1[I0?C1?]?1=[RcT?0?01?][I0??C1?]=[RTc?0??RcT?C1?]?
倒數(shù)第三個(gè)等式變換到倒數(shù)第二個(gè)等式,使用的轉(zhuǎn)置是因?yàn)?span id="ozvdkddzhkzd" class="katex--inline">RcR_cRc?是正交陣,證明戳此處 ,此外,平移矩陣的逆就是他的負(fù)數(shù)平移向量,進(jìn)而可以得到外參矩陣參數(shù)和相機(jī)姿態(tài)是直接相關(guān)的:
R=RcTt=?RC\begin{aligned} R&=R_c^T\\ t&=-RC \end{aligned} Rt?=RcT?=?RC?
不要混淆了世界坐標(biāo)系的變換RRR和相機(jī)坐標(biāo)系的變換CCC
此網(wǎng)址有demo展示。
內(nèi)參矩陣
內(nèi)參矩陣是將3D相機(jī)坐標(biāo)變換到2D齊次圖像坐標(biāo)。透視投影的一個(gè)理想模型就是針孔相機(jī)。
內(nèi)參矩陣如下
K=[fxsx00fyy0001]K=\begin{bmatrix} f_x&s&x_0\\ 0&f_y&y_0\\ 0&0&1 \end{bmatrix} K=???fx?00?sfy?0?x0?y0?1????
其中每一個(gè)參數(shù)都有實(shí)際意義。
-
表示焦距的參數(shù):fx,fyf_x,f_yfx?,fy?
焦距就是真空與圖像平面(投影屏幕)的距離,類似于人眼和視網(wǎng)膜,焦距的度量是針對像素的。針孔相機(jī)的fx,fyf_x,f_yfx?,fy?有相同的值。上圖中紅線部分就是焦距。但是在實(shí)際中,fxf_xfx?和fyf_yfy?一般不同,因?yàn)?/p>
- 數(shù)碼相機(jī)傳感器的缺陷
- 后處理中圖像被非均勻縮放
- 相機(jī)透鏡導(dǎo)致的無意的失真
- 相機(jī)使用了失真的格式,透鏡將寬屏場景壓縮到標(biāo)準(zhǔn)大小的傳感器中
- 相機(jī)校準(zhǔn)的誤差
-
主點(diǎn)偏移x0,y0x_0,y_0x0?,y0?
相機(jī)的主軸是與圖像平面垂直且穿過真空的線,它與圖像平面的焦點(diǎn)稱為主點(diǎn)。
主點(diǎn)偏移就是主點(diǎn)位置相對于圖像平面(投影面)的位置。上圖中,增加x0x_0x0?的值相當(dāng)于把針孔向右移動(dòng),等價(jià)將投影面向左移動(dòng)同時(shí)保持針孔位置不變。
-
軸傾斜
軸傾斜會(huì)導(dǎo)致投影圖像的形變。
-
焦距-從像素到世界單元
內(nèi)參矩陣只關(guān)心相機(jī)坐標(biāo)和圖像坐標(biāo)之間的關(guān)系,與相機(jī)的絕對尺寸無關(guān)。針對焦距和主點(diǎn)偏移使用響度單元可以表示相機(jī)的相對尺寸,換句話說就是投影面的位置與其尺寸(以像素為單位)相關(guān)。
另一種說法是內(nèi)參相機(jī)變換與相機(jī)的幾何均勻縮放無關(guān),利用像素單元表示尺寸,可以捕捉到這種不變性。
可以使用相似三角形將像素單元轉(zhuǎn)換到世界單元中,前提是你知道世界單元中至少一個(gè)相機(jī)尺寸。比如你知道相機(jī)的投影面(數(shù)字傳感器)寬度為WWW毫米,圖片寬度(像素為單位)為www,那就可以將焦距fxf_xfx?轉(zhuǎn)換為世界單元
Fx=fxWwF_x=f_x\frac{W}{w} Fx?=fx?wW?
其它的參數(shù)fy,x0,y0f_y,x_0,y_0fy?,x0?,y0?也可以被轉(zhuǎn)換為對應(yīng)的世界單元Fx,X0,Y0F_x,X_0,Y_0Fx?,X0?,Y0?
Fy=fyHhX0=x0WwY0=y0HhF_y=fy\frac{H}{h}\\ X_0=x_0\frac{W}{w}\\ Y_0=y_0\frac{H}{h} Fy?=fyhH?X0?=x0?wW?Y0?=y0?hH? -
2D變換中的相機(jī)內(nèi)參的計(jì)算
將內(nèi)參矩陣分解為切變(shear,類似于將長方形壓成平行四邊形的變形方式)、縮放,平移變換,分別對應(yīng)軸傾斜、焦距、主點(diǎn)偏移
K=[fxsx00fyy0001]=[10x001y0001]×[fx000fy0001]×[1sfx0010001]\begin{aligned} K&=\begin{bmatrix} f_x&s&x_0\\ 0&f_y&y_0\\ 0&0&1 \end{bmatrix}\\ &=\begin{bmatrix} 1&0 &x_0\\ 0&1&y_0\\ 0&0&1 \end{bmatrix}\times \begin{bmatrix} f_x&0&0\\ 0&f_y&0\\ 0&0&1 \end{bmatrix}\times \begin{bmatrix} 1&\frac{s}{f_x}&0\\ 0&1&0\\ 0&0&1 \end{bmatrix} \end{aligned} K?=???fx?00?sfy?0?x0?y0?1????=???100?010?x0?y0?1????×???fx?00?0fy?0?001????×???100?fx?s?10?001?????
第二個(gè)等式右邊三個(gè)矩陣依次是:2D平移、2D縮放、2D切變另一種等價(jià)的分解是將切變放在縮放前面
K=[10x001y0001]×[1sfx0010001]×[fx000fy0001]K=\begin{bmatrix} 1&0 &x_0\\ 0&1&y_0\\ 0&0&1 \end{bmatrix}\times \begin{bmatrix} 1&\frac{s}{f_x}&0\\ 0&1&0\\ 0&0&1 \end{bmatrix}\times \begin{bmatrix} f_x&0&0\\ 0&f_y&0\\ 0&0&1 \end{bmatrix} K=???100?010?x0?y0?1????×???100?fx?s?10?001????×???fx?00?0fy?0?001????
有一點(diǎn)需要注意:內(nèi)參不影響可見性——阻隔對象(occluded objects)在圖像空間中無法通過簡單的2D變換顯示出來。這里的occluded objects就是那些你希望看到,但是由于某些原因看不到的對象,比如目標(biāo)跟蹤的時(shí)候,一個(gè)目標(biāo)被另一個(gè)目標(biāo)遮擋了。
總結(jié)
綜上可以發(fā)現(xiàn)相機(jī)矩陣可以通過如下方法被分解:
- 全相機(jī)矩陣被分解為內(nèi)參和外參矩陣
- 外參矩陣指示3D旋轉(zhuǎn)和平移
- 內(nèi)參矩陣指示2D變換
整個(gè)分解方法如下
P=KIntrinsicMatrix×[R∣t]ExtrinsicMatrix=[10x001y0001]2DTranslation×[fx000fy0000]2DScaling×[1sfx0010001]2DShear×[I∣t]3DTranslation×[R001]3DRotation\begin{aligned} P&=K_{Intrinsic\ Matrix}\times[R|t]_{Extrinsic\ Matrix}\\ &=\begin{bmatrix} 1&0&x_0\\ 0&1&y_0\\ 0&0&1 \end{bmatrix}_{2D\ Translation}\times \begin{bmatrix} f_x&0&0\\ 0&f_y&0\\ 0&0&0 \end{bmatrix}_{2D\ Scaling}\times \begin{bmatrix} 1&\frac{s}{f_x}&0\\ 0&1&0\\ 0&0&1 \end{bmatrix}_{2D\ Shear}\\&\quad \times \begin{bmatrix} I|t \end{bmatrix}_{3D\ Translation}\times \begin{bmatrix} R&0\\0&1 \end{bmatrix}_{3D\ Rotation} \end{aligned} P?=KIntrinsic?Matrix?×[R∣t]Extrinsic?Matrix?=???100?010?x0?y0?1????2D?Translation?×???fx?00?0fy?0?000????2D?Scaling?×???100?fx?s?10?001????2D?Shear?×[I∣t?]3D?Translation?×[R0?01?]3D?Rotation??
戳此處有交互式demo
demo中提供了三種外參接口(世界坐標(biāo)系,相機(jī)坐標(biāo)系,look-at),三種交互效果不同,前兩種的方向相反,世界坐標(biāo)系中向左移動(dòng)表示相機(jī)坐標(biāo)系中向右移動(dòng),但是它們都有六個(gè)參數(shù)控制:
- txt_xtx? 表示沿著水平方向移動(dòng)相機(jī)
- tyt_yty?表示沿著垂直方向移動(dòng)相機(jī)
- tzt_ztz?表示沿著前后方向移動(dòng)相機(jī)
- pxp_xpx?表示鏡頭不平移,但是繞x軸做俯仰旋轉(zhuǎn)
- pyp_ypy?表示鏡頭不平移,但是繞垂直軸y軸做左右搖頭旋轉(zhuǎn)
- pzp_zpz?表示鏡頭不平移,但是繞z軸做順時(shí)針(或者逆時(shí)針)旋轉(zhuǎn)
demo也提供了內(nèi)參的接口,包括四個(gè)參數(shù)控制:
- 焦距(Focal length):鏡頭的前后縮進(jìn)(不是縮放)
- 軸傾斜(Axis Skew):可以導(dǎo)致球變形,平面上顯示橢球形
- x0x_0x0?表示主點(diǎn)偏移,相機(jī)不動(dòng),左右移動(dòng)成像平面
- y0y_0y0?表示主點(diǎn)偏移,相機(jī)不動(dòng),上下移動(dòng)成像平面
總結(jié)
以上是生活随笔為你收集整理的相机矩阵(Camera Matrix)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何申请浦发美丽女人巧虎卡?申请要满足这
- 下一篇: 损失函数梯度对比-均方差和交叉熵