ORB_SLAM2帧Frame
生活随笔
收集整理的這篇文章主要介紹了
ORB_SLAM2帧Frame
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
??在追蹤線程的一開始就會創建一個幀
cv::Mat Tracking::GrabImageMonocular(const cv::Mat &im,const double ×tamp)
構造函數
在構造函數中,會對特征點進行提取。
ExtractORB(0,imGray);
特征點分配至網格
將圖像劃分為48*64的網格,然后將特征點放入每個網格中。
if(mbInitialComputations){// 計算去畸變后圖像的邊界ComputeImageBounds(imGray);// 表示一個圖像像素相當于多少個圖像網格列(寬)mfGridElementWidthInv=static_cast<float>(FRAME_GRID_COLS)/static_cast<float>(mnMaxX-mnMinX);// 表示一個圖像像素相當于多少個圖像網格行(高)mfGridElementHeightInv=static_cast<float>(FRAME_GRID_ROWS)/static_cast<float>(mnMaxY-mnMinY);//給類的靜態成員變量復制fx = K.at<float>(0,0);fy = K.at<float>(1,1);cx = K.at<float>(0,2);cy = K.at<float>(1,2);// 猜測是因為這種除法計算需要的時間略長,所以這里直接存儲了這個中間計算結果invfx = 1.0f/fx;invfy = 1.0f/fy;//特殊的初始化過程完成,標志復位mbInitialComputations=false;}//計算 baslinemb = mbf/fx;// 將特征點分配到圖像網格中 AssignFeaturesToGrid();
?
?
將特征點分配到網格中
void Frame::AssignFeaturesToGrid()
?
?
判斷路標點是否在當前幀的視野中
(1)相機坐標系下,其深度應大于0
// Step 2 關卡一:檢查這個地圖點在當前幀的相機坐標系下,是否有正的深度.如果是負的,表示出錯,直接返回falseif(PcZ<0.0f)return false;
(2)投影到圖像后不能越界
if(u<mnMinX || u>mnMaxX)return false;if(v<mnMinY || v>mnMaxY)return false;
(3)相機光心----路標點間的長度要在范圍內
// Step 4 關卡三:計算MapPoint到相機中心的距離, 并判斷是否在尺度變化的距離內// 得到認為的可靠距離范圍:[0.8f*mfMinDistance, 1.2f*mfMaxDistance]const float maxDistance = pMP->GetMaxDistanceInvariance();const float minDistance = pMP->GetMinDistanceInvariance();// 得到當前地圖點距離當前幀相機光心的距離,注意P,mOw都是在同一坐標系下才可以// mOw:當前相機光心在世界坐標系下坐標const cv::Mat PO = P-mOw;//取模就得到了距離const float dist = cv::norm(PO);//如果不在允許的尺度變化范圍內,認為重投影不可靠if(dist<minDistance || dist>maxDistance)return false;
(4)當前的觀測方向和路標點的平均方向夾角過大
// 計算當前相機指向地圖點向量和地圖點的平均觀測方向夾角的余弦值,注意平均觀測方向為單位向量const float viewCos = PO.dot(Pn)/dist;//如果大于給定的閾值 cos(60°)=0.5,認為這個點方向太偏了,重投影不可靠,返回falseif(viewCos<viewingCosLimit)return false;
(5)設置該路標點的屬性:估測的尺度、路標點投影到當前幀的像素坐標
?
?
尋找領域內的特征點
vector<size_t> Frame::GetFeaturesInArea(const float &x, const float &y, const float &r, const int minLevel, const int maxLevel) const
??遍歷路標點投影位置周圍的像素框,然后遍歷像素框中的特征點,計算其和投影位置間的長度,如果小于r即為候選特征點。
?
?
總結
以上是生活随笔為你收集整理的ORB_SLAM2帧Frame的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ORB_SLAM2局部建图线程
- 下一篇: Mat常用赋值方式