日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

相机矩阵(Camera Matrix)

發(fā)布時(shí)間:2023/12/13 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 相机矩阵(Camera Matrix) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

最近翻閱關(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} [Rt]=???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)系是怎樣的,原話為:
the extrinsic matrix is that it describes how the world is transformed relative to the camera
  • RcR_cRc?代表世界坐標(biāo)系中相機(jī)坐標(biāo)系的軸向,也就是當(dāng)前的相機(jī)坐標(biāo)系需要怎么變換到世界坐標(biāo)系中,即所謂的相機(jī)坐標(biāo)系中的變換相對于世界坐標(biāo)系是怎樣的,原話為:
Rc be the rotation matrix describing the camera's orientation with respect to the world coordinate axes

因而可以這樣做:定義一個(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?×[Rt]Extrinsic?Matrix?=???100?010?x0?y0?1????2D?Translation?×???fx?00?0fy?0?000????2D?Scaling?×???100?fx?s?10?001????2D?Shear?×[It?]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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。