这一部分相对比较简单,主要用到opencv的cv::FAST()函数。
文件:ORBextractor.cc
初始化过程除了必要的赋值以外,还主要做了3件事,(1)将总的特征数在不同的金字塔曾进行分配,而分配依据是尺度因子(作者默认为1.2,并不知道为什么是这个),然后层数越高特征数越少。所有层加起来就是指定的特征数。(2)将代码里面的sample复制。(3)计算patch里面的v的最大u,这里变量为umax。后两者都是为计算描述子做准备。
然后是计算金字塔,对尺度因子累乘就行了。
接下来角点检测。循环检测每一层金字塔,划分一定大小的patch,对每个patch进行角点检测,这里直接采用的cv::FAST。需要注意的是,代码里有两个FAST阈值,当大阈值检测不出来时换小阈值。其实,可以考虑自适应。
// 如果检测到的fast特征为空,则降低阈值再进行检测
if (vec_keys_cell.empty())
{
cv::FAST(vec_image_pyramid_[level].rowRange(ini_y, max_y).colRange(ini_x, max_x),
vec_keys_cell, min_fast_threshold_, true);
}
很多时候图像的容易集中在某个局部,另外有很大一部区域角点很稀疏,这样计算出来的描述子很不理想,为了让角点分布更均匀合理,这里运用四叉树算法对角点进行再分布。将图像以中点为远点划分为四个象限:
ni.UL_ = cv::Point2i(interval_x*static_ca