基于Python進(jìn)行相機(jī)校準(zhǔn)
點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)

總覽
為了校準(zhǔn)相機(jī),我們對3D對象(例如圖案立方體)成像,并使用3D對象與其2d圖像之間的3D-2D點(diǎn)對應(yīng)關(guān)系來查找相機(jī)參數(shù)。
我們需要找到兩組參數(shù):內(nèi)在參數(shù)和外在參數(shù)。固有參數(shù)是攝像機(jī)內(nèi)部的那些參數(shù),例如焦距,主要點(diǎn)等,而固有參數(shù)是規(guī)定攝像機(jī)相對于攝像機(jī)的位置t(平移矢量)和方向R(旋轉(zhuǎn)矩陣)的參數(shù)。外部坐標(biāo)系(通常稱為世界坐標(biāo)系)。在第一部分中,我們將僅計(jì)算內(nèi)部參數(shù)(假設(shè)外部參數(shù)是已知的),而在第二部分中,我們將共同計(jì)算內(nèi)部參數(shù)和外部參數(shù)。
內(nèi)部參數(shù)計(jì)算
我們使用的校準(zhǔn)對象是魔方。
我們對立方體進(jìn)行成像,如下圖所示。然后,我們獲得許多3D-2D點(diǎn)對應(yīng)關(guān)系。在這一部分中,我們已經(jīng)計(jì)算了點(diǎn)對應(yīng)關(guān)系,您要做的就是從它們中計(jì)算出固有參數(shù)。3D-2D對應(yīng)關(guān)系在數(shù)據(jù)文件“ pt_corres.mat”中給出。該文件包含“ pts_2D”,2D點(diǎn)和“ cam_pts_3D”以及所有對應(yīng)的3D點(diǎn)。現(xiàn)在,我們必須找到K矩陣

K矩陣
使3D與2D點(diǎn)相關(guān)的矩陣K是具有以下形狀的上三角矩陣。

其中αx,αy表示以x和y像素尺寸表示的焦距,px和py是主要點(diǎn),s是偏斜參數(shù)。
2D點(diǎn)(x,y)與相應(yīng)3D點(diǎn)(X,Y,Z)之間的關(guān)系由下式給出
1. x =αx(X / Z)+ s(Y / Z)+ px
2. y =αy(Y / Z)+ py
內(nèi)部和外部參數(shù)計(jì)算
在上一部分中,我們假設(shè)已知外部參數(shù),然后計(jì)算了內(nèi)部參數(shù),即假設(shè)我們知道了相機(jī)坐標(biāo)系中的3D點(diǎn)對應(yīng)關(guān)系。但是這種情況很少發(fā)生。幾乎總是我們僅在世界坐標(biāo)系中知道3D點(diǎn)的對應(yīng)關(guān)系,因此我們需要估算內(nèi)在和外在參數(shù)。但是在此之前,我們需要獲取3D-2D點(diǎn)對應(yīng)關(guān)系。如圖1所示,相對于世界坐標(biāo)系描述了3D點(diǎn)。該圖顯示了世界坐標(biāo)系的x,y和z軸以及一些示例3D點(diǎn),它們是正方形的角。有28點(diǎn)。
1. 世界坐標(biāo)系中的3D點(diǎn)在rubik_3D_pts.mat中提供,圖像上相應(yīng)的2D點(diǎn)在rubik_2D_pts.mat中提供
2. 接下來,我們要計(jì)算相機(jī)投影矩陣P = K [R t],其中K是內(nèi)部/本征校準(zhǔn)矩陣,R是旋轉(zhuǎn)矩陣,用于指定相機(jī)坐標(biāo)系與世界坐標(biāo)系的方向,而t是轉(zhuǎn)換向量,可以確定攝影機(jī)中心在世界坐標(biāo)系中的位置。
3. 為了計(jì)算P,我們使用“直接線性變換(DLT)”。DLT是要理解的重要算法,下面將對其進(jìn)行詳細(xì)說明。
離散線性變換(DLT)
離散線性變換(DLT)是一種簡單的線性算法,用于從相應(yīng)的3空間和圖像實(shí)體估計(jì)攝像機(jī)投影矩陣P。相機(jī)矩陣的這種計(jì)算稱為切除。最簡單的這種對應(yīng)關(guān)系是在未知相機(jī)映射下的3D點(diǎn)X及其圖像x之間。給定足夠多的這種對應(yīng)關(guān)系,可以確定相機(jī)矩陣。
算法

通過解方程組Ap = 0來計(jì)算投影矩陣P,其中p是包含矩陣P項(xiàng)的向量。
計(jì)算P所需的最小點(diǎn)對應(yīng)數(shù)量
3×4矩陣P具有12個(gè)元素,但比例是任意的,因此具有11個(gè)自由度。由于每個(gè)點(diǎn)的對應(yīng)關(guān)系都有2個(gè)方程,因此至少需要5.5個(gè)對應(yīng)關(guān)系才能求解P。0.5表示從第六個(gè)點(diǎn)開始僅使用一個(gè)方程,即我們選擇x坐標(biāo)或y-第六個(gè)圖像點(diǎn)的坐標(biāo)。
在此最小數(shù)量的對應(yīng)關(guān)系下,該解決方案是精確的,并且可以通過求解Ap = 0來獲得,其中A在這種情況下為11x12矩陣。
如果數(shù)據(jù)不精確,則給出n≥6個(gè)點(diǎn)對應(yīng)關(guān)系,那么將沒有精確的解決方案,我們通過最小化代數(shù)或幾何誤差來解決。
從投影矩陣P獲得參數(shù)K,R和t
通過RQ分解將P分解為K,R,t。它涉及計(jì)算分解A = RQ,其中Q為unit /正交,R為上三角。
驗(yàn)證計(jì)算參數(shù)的準(zhǔn)確性
為此,我們將計(jì)算重新投影誤差,該誤差是對2D點(diǎn)與通過使用計(jì)算出的相機(jī)參數(shù)投影3D點(diǎn)而獲得的2D點(diǎn)之間距離的度量。
該圖以橙色顯示了原始2D點(diǎn),并以綠色顯示了重新投影的點(diǎn)。可以看出,重新投影的點(diǎn)與實(shí)際點(diǎn)非常匹配。

參考文獻(xiàn)
[1] R. Hartley and A. Zissermann, Multiview geometry, 2nd edition, Cambridge University Press.
[2] Z. Zhang. A flexible new technique for camera calibration. IEEE Transactions on Pattern Analysis and Machine Intelligence, 22(11):1330–1334, 2000.
有關(guān)詳細(xì)代碼,請?jiān)L問https://github.com/sreenithy/Camera-Calibration。
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會(huì)逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會(huì)根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會(huì)請出群,謝謝理解~
