【ORB_SLAM2源码解读】根据特征的点的响应值筛选经过均匀化后的特征点(10)

图文讲解

// Retain the best point in each node
// 节点分裂好了之后, 节点的数目就是要提取特征点的数目, 所以一个节点只保留一个特征点, 特征点的筛选条件是特征点的响应强度
vector<cv::KeyPoint> vResultKeys;
vResultKeys.reserve(nfeatures);
for(list<ExtractorNode>::iterator lit=lNodes.begin(); lit!=lNodes.end(); lit++)
{
    // 节点特征点的索引
    vector<cv::KeyPoint> &vNodeKeys = lit->vKeys;
    // 节点第一个特征点的指针
    cv::KeyPoint* pKP = &vNodeKeys[0];
    // 获取特征点的响应值
    float maxResponse = pKP->response;
    // 遍历特征点寻找响应值大的特征点
    for(size_t k=1;k<vNodeKeys.size();k++)
    {
        // 如果发现响应值大的就替换指针
        if(vNodeKeys[k].response>maxResponse)
        {
            pKP = &vNodeKeys[k];
            maxResponse = vNodeKeys[k].response;
        }
    }
    // 将满足条件的特征点存储到vResultKeys
    vResultKeys.push_back(*pKP);
}

// 接下来执行下面代码

// PATCH_SIZE 也会随着图层进行缩放 为下一次计算做准备工作
const int scaledPatchSize = PATCH_SIZE*mvScaleFactor[level];

// Add border to coordinates and scale information
// 遍历当前金字塔图层均匀化和筛选后的特征点
const int nkps = keypoints.size();
for(int i=0; i<nkps ; i++)
{
    // 将特征点的坐标转换到 包含提取特征点的图像的16个扩充像素的大图中
    keypoints[i].pt.x+=minBorderX;
    keypoints[i].pt.y+=minBorderY;
    // 同时存储特征点是提取自那一个图层
    keypoints[i].octave=level;
    // 同时存储用于计算特征点旋转不变性的圆半径
    keypoints[i].size = scaledPatchSize;
}

视频讲解

你可能感兴趣的:(从零开始学习SLAM,ORB_SLAM2)