FAST關鍵點
選取像素p,假設它的亮度為Ip;???. ?
設置一個閾值T(比如Ip的20%);
以像素p為中心,選取半徑為3的圓上的16個像素點;
假如選取的圓上,有連續的N個點的亮度大于Ip+T或小于Ip-T,那么像素p可以被認為是特征點;?
循環以上4步,對每一個像素執行相同操作。
FAST 描述子
論文:BRIEF: Binary?Robust?Independent?Elementary?Features
BRIEF算法的核心思想是在關鍵點P的周圍以一定模式選取N個點對,把這N個點對的比較結果組合起來作為描述子。為了保持踩點固定,工?程上采用特殊設計的固定的pattern來做
灰度質心法
原始的FAST關鍵點沒有方向信息,這樣當圖像發生旋轉后,brief描述子也會發生變化,使得特征點對旋轉不魯棒
解決方法:orientated FAST
使用灰度質心法計算特征點的方向,
什么是灰度質心法?
下面重點說一下如何計算灰度質心。
以上是灰度質心法求關鍵點旋轉角度的原理。
在一個圓內計算灰度質心
下圖P為幾何中心,Q為灰度質心
思考:為什么是圓?不是正方形?
ORBSLAM里面是先旋轉坐標再從圖像中采點提取,并不是先取那塊圖像再旋轉,見computeOrbDescriptor函數里的這個表達式
#define?GET_VALUE(idx) \ ???center[cvRound(pattern[idx].xb?+?pattern[idx].ya)step?+?\ ??//y'step???????cvRound(pattern[idx].xa?-
pattern[idx].yb)]
會導致下方采集點的時候綠色和黃色部分就是不同的像素
下面求圓內的坐標范圍
umax:1/4圓的每一行的u軸坐標邊界(下圖中橙色線段FG)
vmax = cvFloor(HALF_PATCH_SIZE * sqrt(2 .f) / 2 + 1) ; vmin = cvCeil(HALF_PATCH_SIZE * sqrt(2 .f) / 2) ;
// 對應從D到B的紅色弧線,umax坐標從D到C for (v = 0 ; v <= vmax; ++v)
umax[v] = cvRound(sqrt(hp2 - v * v)) ;
// 對應從B到E的藍色弧線,umax坐標從C到A
for (v = HALF_PATCH_SIZE , v0 = 0 ; v >= vmin ; --v) {
while (umax[v0] == umax[v0 + 1]) ++v0 ;
umax[v] = v0 ;
++v0 ;
}
?
參考:
認真的虎ORBSLAM2源碼解讀(四):圖解ORB特征提取ORBextractor_orbextractor 提取特征-CSDN博客?
https://www.cnblogs.com/wall-e2/p/8057448.html
特征點角度計算
steer brief
點v 繞 原點旋轉θ 角,得到點v’,假設?v點的坐標是(x, y) ,那么可以推導得到 v’點的坐標(x’, y’)
參考:
https://www.cnblogs.com/zhoug2020/p/7842808.html
IC_Angle 計算技巧
在一個圓域中算出m10(x坐標)和m01(y坐標),計算步驟是先算出中間紅線的m10,然后在平行于x軸算出m10和m01?,一次計算相當?于圖像中的同個顏色的兩個line。
為什么要重載小括號運算符 operator() ?
可以用于仿函數(一個可以實現函數功能的對象)
仿函數(functor)又稱為函數對象(function?object)是一個能行使函數功能的類。仿函數的語法幾乎和我們普通的函數調用一樣,不過作?為仿函數的類,都必須重載operator()運算符
1.仿函數可有擁有自己的數據成員和成員變量,這意味著這意味著仿函數擁有狀態。這在一般函數中是不可能的。?2.仿函數通常比一般函數有更好的速度。
擴展閱讀
C++operator()(重載小括號運算符)_c++的bool operator()-CSDN博客
金字塔的計算
圖像金字塔對應函數為:ORBextractor::ComputePyramid
特征點數量的分配計算
參考:https://zhuanlan.zhihu.com/p/61738607
使用四叉樹均勻分布特征點
ORB特征提取策略對ORB-SLAM2性能的影響:ORB-SLAM2中的ORB特征提取方法相對于OpenCV中的方法,提高了ORB-SLAM2的軌跡精?度和魯棒性。增加特征提取的均勻性可以提高系統精度,但是似乎會降低特征提取的重復性。
參見:https://zhuanlan.zhihu.com/p/57235987?對應函數 DistributeOctTree
. ?如果圖片的寬度比較寬,就先把分成左右w/h份。一般的640×480的圖像開始的時候只有一個node。
. ?如果node里面的點數>1,把每個node分成四個node,如果node里面的特征點為空,就不要了,刪掉。?. ?新分的node的點數>1,就再分裂成4個node。如此,一直分裂。
. ?終止條件為:node的總數量> [公式] ,或者無法再進行分裂。?. ?然后從每個node里面選擇一個質量最好的FAST點。
參考:https://zhuanlan.zhihu.com/p/61738607?ExtractorNode::DivideNode
高斯處理??
特征點去畸變
近點和遠點
在雙目或RGB-D模式下,特征點對應的深度值小于40倍的雙目/RGB-D基線稱之為近點,否則稱之為遠點。?近點特征點對三角化得到的三維點坐標比較準確,可以提供旋轉、平移、尺度信息。
遠點特征點僅能夠提供相對準確的旋轉信息,無法提供比較準確的尺度和平移信息。只有當多個視角下多次觀測到的遠點我們才會考慮三角?化。