ORB-SLAM2中MapPoints的描述子的计算

//我们在从金字塔的图像中获取特征点时为每一个特征点计算了描述子
//现在看看如何计算一个空间的地图点的描述子
void MapPoint::ComputeDistinctiveDescriptors()
{
    // Retrieve all observed descriptors
    vector vDescriptors;
    //获取到某一个地图点可以被哪些关键帧观测到以及在这些关键帧上与该地图点对应的特征点的编号
    map observations;

    {
        unique_lock lock1(mMutexFeatures);
        if(mbBad)
            return;
       
        observations=mObservations;
    }

    if(observations.empty())
        return;
    //vDescriptors用来存储这些所有与可以观测到该地图点的特征点的描述子
    vDescriptors.reserve(observations.size());

    for(map::iterator mit=observations.begin(), mend=observations.end(); mit!=mend; mit++)
    {
        //获取可以观测到此地图点的所有关键帧
        KeyFrame* pKF = mit->first;

        //然后获取,在该关键帧下与该地图点对应的特征点的描述子
        //vDescriptors中存储了所有的那些可以观测到该地图点的图像上的与之对应的特征点的描述子。
        if(!pKF->isBad())
            vDescriptors.push_back(pKF->mDescriptors.row(mit->second));
    }

    if(vDescriptors.empty())
        return;

    // Compute distances between them
    const size_t N = vDescriptors.size();

    //Distances是一个N*N的二维数组
    float Distances[N][N];
    //计算任意两个描述子之间的海明距离
    //Distances[N][N]是一个对称矩阵并且对角线上的元素都为0
    for(size_t i=0;i vDists(Distances[i],Distances[i]+N);
        //将这些距离进行排序
        sort(vDists.begin(),vDists.end());
        //经过排序之后都要取排序后的中值
        int median = vDists[0.5*(N-1)];

        //遍历Distances中的所有行找到一个最小的中值,那么该描述子就可以代表这个地图点的描述子
        if(median lock(mMutexFeatures);
        mDescriptor = vDescriptors[BestIdx].clone();
    }
}

Take the descriptor with least median distance to the rest

就是在所有的描述子中找到那个与其他所有的描述子之间的距离的中值最小的描述子作为该地图点的描述子,

这里选择的是中值作为衡量标准。

你可能感兴趣的:(SLAM)