ORB-SLAM3 Initializer.cpp函數解讀
作者:
點擊上方「電腦視覺工坊」,選擇「星標」
乾貨第一時間送達
構造函數
Initializer::Initializer(const Frame &ReferenceFrame, float sigma, int iterations)參數: 參考幀(第一幀), 誤差, 迭代次數 操作:讀取參考幀的相機模型, 內參, 去畸變的特徵點等傳入參數
初始化:並行的計算前後兩幀的本質矩陣和基礎矩陣,選出來評分高的恢復旋轉和平移
bool Initializer::Initialize(const Frame &CurrentFrame, const vector &vMatches12, cv::Mat &R21, cv::Mat &t21, vectorcv::Point3f &vP3D, vector&vbTriangulated) 參數: 當前幀(第二幀), 前後幀的匹配關係(), 參考幀到當前幀的旋轉, 參考幀到當前幀的平移(==當前幀指向參考幀==), 三角化後的點, 特徵是否被三角化過返回值:bool->初始化是否成功的標誌 操作:
- vMatches12中的匹配關係以<==第一幀特徵索引,第二幀特徵索引==>存儲在mvMatches12中, 同時mvbMatched1[i]設置為true表示第一幀中該索引的特徵點匹配成功
- 從匹配中不重複的隨機選擇mMaxIterations組點,每組8個
- 開兩個執行緒同時計算單應和基本矩陣
- 計算得分
- 選擇得分高的矩陣來恢復兩幀位姿
尋找最優單應矩陣
void Initializer::FindHomography(vector&vbMatchesInliers, float &score, cv::Mat &H21) 參數: 匹配的Inliers, 最後的得分, 單應矩陣 操作:
- 歸一化
- 利用選擇的mMaxIterations組匹配點用八點法計算單應矩陣(ComputeH21(vPn1i,vPn2i))
- 恢復初始尺度(歸一化前的)
- 保留最高得分的單應矩陣及對應的匹配內點
需要最優基礎矩陣
void Initializer::FindFundamental(vector&vbMatchesInliers, float &score, cv::Mat &F21) 參數: 匹配的Inliers, 最後的得分, 基礎矩陣 操作:
- 歸一化
- 利用選擇的mMaxIterations組匹配點用八點法計算基礎矩陣(ComputeF21(vPn1i,vPn2i))
- 恢復初始尺度(歸一化前的)
- 保留最高得分的基礎矩陣及對應的匹配內點
計算單應矩陣
這樣就可以用一組匹配點構造兩個約束(其實是三個,但是三個線性相關,所以只取前兩個),所以自由度為8的單應矩陣需要四組匹配點就可以算出。 操作:
- 利用八組匹配點構造A矩陣
- 利用SVD分解求解AX=0型的方程
- 最小特徵值對應的特徵向量就是方程的解(可參考多視圖幾何第二版198-200頁)
計算基礎矩陣
cv::Mat Initializer::ComputeF21(const vectorcv::Point2f &vP1,const vectorcv::Point2f &vP2) 參數:
本文僅做學術分享,如有侵權,請聯繫刪文。
下載1在「電腦視覺工坊」公眾號後台回復:深度學習,即可下載深度學習演算法、3D深度學習、深度學習框架、目標檢測、GAN等相關內容近30本pdf書籍。
下載2在「電腦視覺工坊」公眾號後台回復:電腦視覺,即可下載電腦視覺相關17本pdf書籍,包含電腦視覺演算法、Python視覺實戰、Opencv3.0學習等。
下載3在「電腦視覺工坊」公眾號後台回復:SLAM,即可下載獨家SLAM相關影片課程,包含視覺SLAM、雷射SLAM精品課程。
重磅!電腦視覺工坊-學習交流群已成立
掃碼添加小助手微信,可申請加入3D視覺工坊-學術論文寫作與投稿 微信交流群,旨在交流高峰會、頂刊、SCI、EI等寫作與投稿事宜。
同時也可申請加入我們的細分方向交流群,目前主要有3D視覺、CV&深度學習、SLAM、三維重建、點雲後處理、自動駕駛、CV入門、三維測量、VR/AR、3D人臉識別、醫療影像、缺陷檢測、行人重識別、目標跟蹤、視覺產品落地、視覺競賽、車牌識別、硬體選型、學術交流、求職交流等微信群,請掃描下面微訊號加群,備註:」研究方向+學校/公司+昵稱「,例如:」3D視覺 + 上海交大 + 靜靜「。請按照格式備註,否則不予通過。添加成功後會根據研究方向邀請進去相關微信群。原創投稿也請聯繫。
▲長按加微信群或投稿
▲長按關注公眾號