ORB特征点提取代码详解 ExtractORB
最近在尝试将ORB提取特征点机制放置于芯片上,便于后期调用,减小CPU的计算负担,故最近对ORB特征点提取代码进行了研读,记录一下,有不对的还请指教;
首先在Frame()初始化中,含有ExtractORB(0,imGray); 这次我们研究的全在这个特征点提取函数里面;
void Frame::ExtractORB(int flag, const cv::Mat &im)
{
if(flag==0)
(*mpORBextractorLeft)(im,cv::Mat(),mvKeys,mDescriptors);
else
(*mpORBextractorRight)(im,cv::Mat(),mvKeysRight,mDescriptorsRight);
}
这里用了()的重载,直接跳转 *mpORBextractorLeft ; 跳转至void ORBextractor::operator();
特征点的提取均在此函数实现;
if(_image.empty())
return;
Mat image = _image.getMat();
assert(image.type() == CV_8UC1 );
// Pre-compute the scale pyramid
// 构建图像金字塔
ComputePyramid(image);
读取图片,为空返回; 不然建立金字塔,过程不再阐述;
重点 ComputeKeyPointsOctTree
// 计算每层图像的兴趣点 //计算关键点并生成四叉树
vector < vector<KeyPoint> > allKeypoints; // vector<vector<KeyPoint>>
ComputeKeyPointsOctTree(allKeypoints);
//ComputeKeyPointsOld(allKeypoints);
首先开辟一个vector < vector > allKeypoints 空间,存放提取的特征点,后面进入 ComputeKeyPointsOctTree, 提取特征点,并采用四叉树的方法对提取的特征点进行均匀化;
void ORBextractor::ComputeKeyPointsOctTree(vector<vector<KeyPoint> >& allKeypoints)
{
allKeypoints.resize(nlevels);
const float W = 30;
// 对每一层图像做处理
for (int level = 0; level < nlevels; ++level)
{
const int minBorderX = EDGE_THRESHOLD-3;
const int minBorderY = minBorderX;
const int maxBorderX = mvImagePyramid[level].cols-EDGE_THRESHOLD+3;
const int maxBorderY = mvImagePyramid[level