2018-05-30相機矩陣(Camera Matrix)

前言

最近翻閱關于從2D視頻或者圖片中重構3D姿態的文章及其源碼,發現都有關于攝像機參數的求解,查找了相關資料,做一下筆記。

國際慣例,來一波參考網址

透視變換透鏡畸變及校正模型相機校正(Camera Calibration)Matlab相機校正工具箱【立體視覺(一)】由基本矩陣、本質矩陣恢復攝像機矩陣——Structure from motionMultiple View Geometry in Computer Vision(計算機視覺中的多視角幾何),附matlab代碼?、相機矩陣的分解系列教程攝像機矩陣詳解(中文版)

【注】本文主要提取倒數第二個大牛博客的主要內容,最后一個博客是某位國內大神對這位大牛博客的精解,其它部分為圖像知識的補充,主要來源于《OpenGL編程指南》第五章節。博客不在于深究各種細節實現,主要在于對此知識點有所了解,也就是看大牛們的代碼的時候至少要知道我們需要求解的東西是什么,都包含什么參數。對理論沒興趣的可以直接看總結,也可看demo展示.

基本知識復習

相機模型

先看看使用相機的主要步驟:

移動相機到拍攝位置,鏡頭對準某個方向(視圖變換,view transform)

將拍攝對象一到場景中的某個位置(模型變換,model transform)

設置相機焦距或調整縮放比例(投影變換,projection transform)

對結果圖像拉伸或者壓縮,變換為需要的圖片大小(視口變換,viewpoint transform)

其中前兩步可以合并為一個步驟,稱為模型-視圖變換(model-view transform),包含多級平移、旋轉、縮放。下圖摘自OpenGL一書,用于理解對象從一個坐標系統到另一個坐標系統的變換過程

齊次坐標

先看看矩陣乘法在三維坐標變換的缺點:將三維坐標視為一個列向量,那么矩陣*列向量得到的新向量的每一個分量,都是舊的列向量的線性函數,因而三維笛卡爾坐標與矩陣的乘法只能實現三維坐標的縮放和旋轉,而無法實現坐標平移。?

可以發現將三維的笛卡爾坐標添加一個額外坐標,就可以實現坐標平移了,而且保持了三維向量與矩陣乘法具有的縮放和旋轉操作。這個就稱為齊次坐標。而這種變換也稱為仿射變換(affine transformation),不屬于線性變換(線性變換的一個重要規則就是(0,0,0)(0,0,0)映射以后仍是(0,0,0)(0,0,0))。

齊次坐標的好處也就顯而易見了:

進一步完成透視變換,也可戳這里,其實第四個分量就是用于實現透視投影變換的,所有的分量同時處理相同值不會改變它所表達的位置。

使用線性變換完成模型的平移

【注意】我們經常將第四個分量記為w,OpenGL會在顯示幾何體的時候用前三個分量除以第四個分量,從而將齊次坐標變換為笛卡爾坐標。當w=0.0的時候,表示物體位于無限近的位置,透視效果就是無限大的,所以會產生一些無法預知的結果。而且當w是負數的時候,雖然理論可以,但是負數w值可能會給圖形管線的某些環節帶來麻煩,當與其它的正數w進行計插值計算的時候,導致結果接近或等于0。避免這個問題的方法就是保證第四個分量w為正。

相機矩陣內參和外參的分解

相機矩陣

何為幾何相機校正(Geometric camera calibration) ?

也稱為相機反切(camera resectioning),主要用于估計圖像或者視頻攝像機的透鏡和圖像傳感器的相關參數。使用這些參數可以糾正透鏡畸變,度量真實世界中物體的大小,或者相機在一個場景中的定位。因而可以被用于機器視覺,去檢測或者度量事物,也可用于機器人中,幫助導航系統和3D重建。

相機參數都有哪些?估計它們需要的條件?評估所估算的相機參數好壞的標準?

①主要包含內參(intrinsics)、外參(extrinsics)、畸變系數(distortion coefficients)

②估計參數需要3D世界坐標及其對應的2D圖像點。比如在重構3D姿態的時候,需要同時輸入圖片及圖片中對應的人的骨骼2D坐標點。

③評估所估計相機參數的方法就是:首先畫出相機和校準模式的相對位置;隨后計算投影誤差;最后計算參數的估算誤差。在matlab中有Camera Calibrator來進行相機校準和評估參數精確度。


相機矩陣的表示?缺點?

假設有一個3?43?4的相機矩陣,可以將齊次3D坐標轉換為2D圖像坐標。矩陣表示如下?

P=[M|?MC]

這里的’||’代表的是增廣矩陣。其中MM代表可逆的3?3矩陣,C是列向量,代表世界坐標系中相機位置。

相機矩陣可以將3D點投影到2D空間,但是有些缺點:

沒有提供相機的擺放姿態

沒有聽相機的內部幾何特征

不能使用鏡面光照,因為無法在相機坐標系中得到表面法線向量。

相機矩陣的分解?

相機矩陣分解

為了解決上述問題,可以將相機矩陣分解為兩個矩陣的乘積:內參矩陣K和外參矩陣[R|?RC]

P=K[R|?RC]

其中,3?3的上三角陣KK描述了相機的內參比如焦距;3?3的旋轉矩陣R的列表示相機參考幀的世界坐標軸方向;向量C是世界坐標系中的相機中心。那么向量t=?RC就給出了相機坐標系中的世界原點位置。我們需要做的就是求解這些參數,當然前提是我們已經知道P了。

相機中心

相機中心的求解比較簡單,利用分解前的相機矩陣,由于P的最后一列是由?MC得到的,而MM在原始的相機矩陣的前3?3部分已經給出了,所以只需要用?M?1左乘它即可。

旋轉矩陣和內參

首先注意旋轉矩陣R是正交的,因為每一列代表的是一個軸(想想三維坐標系的xyz軸是不是垂直的);而內參矩陣K是一個上三角陣。然后考慮到QR分解的用途就是將一個滿秩矩陣分解為上三角陣和正交陣的乘積。算法好像不難,matlab的寫法如

function[R Q]=rq(M)

[Q,R]= qr(flipud(M)')

R = flipud(R');??

?R =fliplr(R);? ??

Q =Q';? ? ?

?Q =flipud(Q);

但是發現QR分解的結果不唯一,對K的任何一列以及R的對應行取反(negative)都不會導致相機矩陣結果的改變。

如果滿足如下兩個條件,可以讓K的對角元為正

圖像的X/Y軸所指方向與相機的X/Y軸方向相同

相機處于z軸正方向

所以可以取QR分解中,使得KK的對角元為正的解,讓KK對角元為正的代碼如下

# make diagonal of K positive

T =diag(sign(diag(K)));

K = K * T;

R = T * R;? # (T is its own inverse)

然而在實際中,照相機和圖片的軸經常不統一,所以K的對角元也不應該是正的,如果強制它們為正,將會導致一些不好的副作用,包含:

對象位于相機錯誤的一邊

旋轉矩陣行列式為?1而不是1

不正確的鏡面光照(?specular lighting)

出現視覺幾何無法被渲染問題,原因在于具有負的w坐標

如果從全正的對角元開始,你需要做的就是:

如果圖像x軸和攝像機x軸指向相反方向,將K的第一列以及R的第一行取反

如果圖像y軸和攝像機y軸指向相反方向,將K的第二列以及R的第二行取反

如果相機俯視是z軸負方向,將K的第三列以及R的第三行取反。

如果R的行列式置為?1,將它取反

以上每一步都能保證相機矩陣不變,最后一步等價于將整個相機矩陣P乘以?1。因為P的操作是基于齊次坐標系的,所以將它乘以任何的常量都無影響。

當然可以使用向量t=?RC去檢查結果,此式代表的是在相機坐標系中的世界坐標系原點。如果都沒錯,那么tx,ty,tz應該能夠反映出在世界原點在相機中的位置(分別指出在中心左邊/右邊,上邊/下邊,相機的前面/后面)

相機矩陣求解

前面看了如何將相機矩陣分解為內參和外參矩陣的乘積。

外參矩陣

相機的外參矩陣描述的是世界坐標中相機的位置,及其指向方向。有兩個成分:旋轉矩陣R和平移向量t。它們并非恰好對應相機的旋轉和平移。

外參矩陣以剛體變換矩陣的形式可以記為:左邊一個3?3旋轉矩陣,右邊一個3?1的平移列向量?

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

這個矩陣描述的就是如何將世界坐標系中的點變換都相機坐標系中,向量tt描述的是世界坐標系原點在相機坐標系中的位置,RR的列代表的是相機坐標系中世界坐標系軸的方向。

從上可以發現,外參主要作用就是描述世界坐標系到相機坐標系的轉換。與我們經常想的相機坐標系到世界坐標系的轉換剛好相反。

如何從相機姿態中求解外參矩陣?

實際中,直接指定相機的姿態比指定世界坐標系中的點如何轉換到相機坐標系中更加自然,通過建立一個剛體變換矩陣描述相機姿態,然后對其取逆即可建立相機的外參矩陣。

因而可以這樣做:定義一個描述相機中心在世界坐標系中的位置的向量C,然后讓Rc代表相機在世界坐標系旋轉到當前姿態需要的旋轉矩陣。那么描述相機姿態的變換矩陣就是(Rc|C)。同樣在底部添加一個行向量(0,0,0,1),那么外參矩陣就是相機姿態矩陣的逆

倒數第三個等式變換到倒數第二個等式,使用的轉置是因為Rc是正交陣,證明戳此處?,此外,平移矩陣的逆就是他的負數平移向量,進而可以得到外參矩陣參數和相機姿態是直接相關的:

不要混淆了世界坐標系的變換RR和相機坐標系的變換CC

網址有demo展示。

內參矩陣

內參矩陣是將3D相機坐標變換到2D齊次圖像坐標。透視投影的一個理想模型就是針孔相機。

內參矩陣如下?

其中每一個參數都有實際意義。

表示焦距的參數:fx,fy

焦距就是真空與圖像平面(投影屏幕)的距離,類似于人眼和視網膜,焦距的度量是針對像素的。針孔相機的fx,fy有相同的值。上圖中紅線部分就是焦距。但是在實際中,fx和fy一般不同,因為

數碼相機傳感器的缺陷

后處理中圖像被非均勻縮放

相機透鏡導致的無意的失真

相機使用了失真的格式,透鏡將寬屏場景壓縮到標準大小的傳感器中

相機校準的誤差

主點偏移x0,y0

相機的主軸是與圖像平面垂直且穿過真空的線,它與圖像平面的焦點稱為主點。

主點偏移就是主點位置相對于圖像平面(投影面)的位置。上圖中,增加x0的值相當于把針孔向右移動,等價將投影面向左移動同時保持針孔位置不變。

軸傾斜

軸傾斜會導致投影圖像的形變。

焦距-從像素到世界單元

內參矩陣只關心相機坐標和圖像坐標之間的關系,與相機的絕對尺寸無關。針對焦距和主點偏移使用響度單元可以表示相機的相對尺寸,換句話說就是投影面的位置與其尺寸(以像素為單位)相關。

另一種說法是內參相機變換與相機的幾何均勻縮放無關,利用像素單元表示尺寸,可以捕捉到這種不變性。

可以使用相似三角形將像素單元轉換到世界單元中,前提是你知道世界單元中至少一個相機尺寸。比如你知道相機的投影面(數字傳感器)寬度為W毫米,圖片寬度(像素為單位)為w,那就可以將焦距fx轉換為世界單元?

其它的參數fy,x0,y0也可以被轉換為對應的世界單元Fx,X0,Y0

2D變換中的相機內參的計算

將內參矩陣分解為切變(shear,類似于將長方形壓成平行四邊形的變形方式)、縮放,平移變換,分別對應軸傾斜、焦距、主點偏移?

第二個等式右邊三個矩陣依次是:2D平移、2D縮放、2D切變

另一種等價的分解是將切變放在縮放前面?

有一點需要注意:內參不影響可見性——阻隔對象(occluded objects)在圖像空間中無法通過簡單的2D變換顯示出來。這里的occluded objects就是那些你希望看到,但是由于某些原因看不到的對象,比如目標跟蹤的時候,一個目標被另一個目標遮擋了。

總結

綜上可以發現相機矩陣可以通過如下方法被分解:

全相機矩陣被分解為內參和外參矩陣

外參矩陣指示3D旋轉和平移

內參矩陣指示2D變換

整個分解方法如下?

此處有交互式demo

demo中提供了三種外參接口(世界坐標系,相機坐標系,look-at),三種交互效果不同,前兩種的方向相反,世界坐標系中向左移動表示相機坐標系中向右移動,但是它們都有六個參數控制:

tx 表示沿著水平方向移動相機

ty表示沿著垂直方向移動相機

tz表示沿著前后方向移動相機

px表示鏡頭不平移,但是繞x軸做俯仰旋轉

py表示鏡頭不平移,但是繞垂直軸y軸做左右搖頭旋轉

pz表示鏡頭不平移,但是繞z軸做順時針(或者逆時針)旋轉

demo也提供了內參的接口,包括四個參數控制:

焦距(Focal length):鏡頭的前后縮進(不是縮放)

軸傾斜(Axis Skew):可以導致球變形,平面上顯示橢球形

x0表示主點偏移,相機不動,左右移動成像平面

y0表示主點偏移,相機不動,上下移動成像平面

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,034評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,413評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,165評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,559評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,781評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,327評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,084評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,278評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,495評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,010評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,241評論 2 375

推薦閱讀更多精彩內容