solvePnP——Perspective-n-Point
- 參考資料:一文了解PnP算法 PnP問題
一、位姿求解方法
- 對(duì)極約束:2D-2D,通過二維圖像點(diǎn)的對(duì)應(yīng)關(guān)系,恢復(fù)兩幀之間相機(jī)的運(yùn)動(dòng)。
- PnP:3D-2D,求解3D到2D點(diǎn)對(duì)運(yùn)動(dòng)的方法。已知3D空間點(diǎn)及其在相機(jī)投影位置時(shí),求解相機(jī)運(yùn)動(dòng)。
- ICP:3D-3D,配對(duì)好的3D點(diǎn),已知世界坐標(biāo)系下的3D點(diǎn)和相機(jī)坐標(biāo)系下的3D點(diǎn)。
二、PnP概念
如果場(chǎng)景的三維結(jié)構(gòu)已知,利用多個(gè)控制點(diǎn)在三維場(chǎng)景中的坐標(biāo)及其在圖像中的透視投影坐標(biāo)即可求解出相機(jī)坐標(biāo)系與世界坐標(biāo)系之間的絕對(duì)位姿關(guān)系,包括絕對(duì)平移向量t以及旋轉(zhuǎn)矩陣R,該類求解方法統(tǒng)稱為N點(diǎn)透視位姿求解 (Perspective-n-Point,PnP問題)。這里的控制點(diǎn)是指準(zhǔn)確知道三維空間坐標(biāo)位置,同時(shí)也知道對(duì)應(yīng)圖像平面坐標(biāo)的點(diǎn)。
已知條件
- n個(gè)
世界坐標(biāo)系
3D參考點(diǎn)(3D reference points)坐標(biāo); - 與3D點(diǎn)對(duì)應(yīng)的、投影在圖像上
相機(jī)圖像坐標(biāo)系
的2D參考點(diǎn)(2D referece points)坐標(biāo);并不是相機(jī)坐標(biāo)系
或相機(jī)像素坐標(biāo)系
,注意區(qū)分、 - 相機(jī)的內(nèi)參K;
求解:
- 世界坐標(biāo)系與攝像機(jī)坐標(biāo)系之間的位姿變換 :{ R ∣ t }
三、PnP的使用場(chǎng)景
- 求解相機(jī)的位姿,一般應(yīng)用于AR,人臉跟蹤等;通常輸入的是物體在世界坐標(biāo)系下的3D點(diǎn)以及這些3D點(diǎn)在圖像上投影的2D點(diǎn),因此求得的是相機(jī)(相機(jī)坐標(biāo)系)相對(duì)于真實(shí)物體(世界坐標(biāo)系)的位姿。
- 求取前一幀到當(dāng)前幀的相機(jī)位姿變換,一般用于slam中;通常輸入的是上一幀中的3D點(diǎn)(在上一幀的相機(jī)坐標(biāo)系下表示的點(diǎn))和這些3D點(diǎn)在當(dāng)前幀中投影得到的2D點(diǎn),所以它求得得是當(dāng)前幀相對(duì)于上一幀得位姿變換
四、OpenCV函數(shù)solvePnP、solvePnPRansac
官網(wǎng)鏈接:OpenCV: Camera Calibration and 3D Reconstruction
- objectPoints:特征點(diǎn)的世界坐標(biāo),坐標(biāo)值需為float型,不能為double型,可以為mat類型,也可以直接輸入vector
- imagePoints:特征點(diǎn)在圖像中的像素坐標(biāo),可以輸入mat類型,也可以直接輸入vector,注意輸入點(diǎn)的順序要與前面的特征點(diǎn)的世界坐標(biāo)一一對(duì)應(yīng)
- cameraMatrix:相機(jī)內(nèi)參矩陣
- distCoeffs:相機(jī)的畸變參數(shù) Mat_(5, 1)
- rvec:輸出的旋轉(zhuǎn)向量:
- tvec:輸出的平移向量
- useExtrinsicGuess: 用于SOLVEPNP迭代的參數(shù)。如果為true(1),函數(shù)使用提供的rvec和tvec值分別作為旋轉(zhuǎn)和平移向量的初始近似,并進(jìn)一步優(yōu)化它們。默認(rèn)值為False。
- flags:PnP的計(jì)算方法包括:DLT,P3P,EPnE,UPnP,每種求解方式存在其限制。
enum { SOLVEPNP_ITERATIVE = 0,
SOLVEPNP_EPNP = 1, //!< EPnP: Efficient Perspective-n-Point Camera Pose Estimation @cite lepetit2009epnp
SOLVEPNP_P3P = 2, //!< Complete Solution Classification for the Perspective-Three-Point Problem
SOLVEPNP_DLS = 3, //!< A Direct Least-Squares (DLS) Method for PnP @cite hesch2011direct
SOLVEPNP_UPNP = 4, //!< Exhaustive Linearization for Robust Camera Pose and Focal Length Estimation
SOLVEPNP_AP3P = 5, //!< An Efficient Algebraic Solution to the Perspective-Three-Point Problem
SOLVEPNP_MAX_COUNT //!< Used for count
};//flag參數(shù)PnP計(jì)算方法
solvePnP的一個(gè)缺點(diǎn)是對(duì)異常值不夠魯棒,當(dāng)我們用相機(jī)定位真實(shí)世界的點(diǎn),可能存在錯(cuò)匹配,對(duì)誤匹配進(jìn)行RANSAC過濾,RANSAC為(Random Sample Consensus, 隨機(jī)抽樣一致性)。文章來源:http://www.zghlxwxcb.cn/news/detail-574196.html
五. PnP問題求解原理
目前解法主要有:直接線性變換(DLT),P3P,EPnE,UPnP,非線性優(yōu)化方法BA。文章來源地址http://www.zghlxwxcb.cn/news/detail-574196.html
- 直接線性變換法DLT:PnP問題之DLT解法 - 知乎
- P3P:P3P推導(dǎo) 利用余弦定理
- EPnP:深入EPnP算法
- 非線性優(yōu)化方法:Bundle Adjustment最小化重投影誤差求解PnP–BA
前面三種方法均可直接調(diào)用OpenCV函數(shù)接口,而非線性優(yōu)化的方法實(shí)現(xiàn)形式多樣,可以利用Ceres、G2o等開源優(yōu)化庫(kù)或者手寫高斯牛頓法實(shí)現(xiàn)。
到了這里,關(guān)于一文讀懂PnP問題及opencv solvePnP、solvePnPRansac函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!