ORB-SLAM2中MapPoints的描述子的计算
生活随笔
收集整理的這篇文章主要介紹了
ORB-SLAM2中MapPoints的描述子的计算
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
//我們?cè)趶慕鹱炙膱D像中獲取特征點(diǎn)時(shí)為每一個(gè)特征點(diǎn)計(jì)算了描述子
//現(xiàn)在看看如何計(jì)算一個(gè)空間的地圖點(diǎn)的描述子
void MapPoint::ComputeDistinctiveDescriptors()
{// Retrieve all observed descriptorsvector<cv::Mat> vDescriptors;//獲取到某一個(gè)地圖點(diǎn)可以被哪些關(guān)鍵幀觀測到以及在這些關(guān)鍵幀上與該地圖點(diǎn)對(duì)應(yīng)的特征點(diǎn)的編號(hào)map<KeyFrame*,size_t> observations;{unique_lock<mutex> lock1(mMutexFeatures);if(mbBad)return;observations=mObservations;}if(observations.empty())return;//vDescriptors用來存儲(chǔ)這些所有與可以觀測到該地圖點(diǎn)的特征點(diǎn)的描述子vDescriptors.reserve(observations.size());for(map<KeyFrame*,size_t>::iterator mit=observations.begin(), mend=observations.end(); mit!=mend; mit++){//獲取可以觀測到此地圖點(diǎn)的所有關(guān)鍵幀KeyFrame* pKF = mit->first;//然后獲取,在該關(guān)鍵幀下與該地圖點(diǎn)對(duì)應(yīng)的特征點(diǎn)的描述子//vDescriptors中存儲(chǔ)了所有的那些可以觀測到該地圖點(diǎn)的圖像上的與之對(duì)應(yīng)的特征點(diǎn)的描述子。if(!pKF->isBad())vDescriptors.push_back(pKF->mDescriptors.row(mit->second));}if(vDescriptors.empty())return;// Compute distances between themconst size_t N = vDescriptors.size();//Distances是一個(gè)N*N的二維數(shù)組float Distances[N][N];//計(jì)算任意兩個(gè)描述子之間的海明距離//Distances[N][N]是一個(gè)對(duì)稱矩陣并且對(duì)角線上的元素都為0for(size_t i=0;i<N;i++){Distances[i][i]=0;for(size_t j=i+1;j<N;j++){int distij = ORBmatcher::DescriptorDistance(vDescriptors[i],vDescriptors[j]);Distances[i][j]=distij;Distances[j][i]=distij;}}// Take the descriptor with least median distance to the rest//需要找到的是一個(gè)最小的中值距離int BestMedian = INT_MAX;int BestIdx = 0;for(size_t i=0;i<N;i++){//將Distences中的每一行單獨(dú)拿出來//因?yàn)樵谶@個(gè)矩陣中第i行表示,第i個(gè)描述子與其他所有描述子之間的海明距離vector<int> vDists(Distances[i],Distances[i]+N);//將這些距離進(jìn)行排序sort(vDists.begin(),vDists.end());//經(jīng)過排序之后都要取排序后的中值int median = vDists[0.5*(N-1)];//遍歷Distances中的所有行找到一個(gè)最小的中值,那么該描述子就可以代表這個(gè)地圖點(diǎn)的描述子if(median<BestMedian){BestMedian = median;BestIdx = i;}}{unique_lock<mutex> lock(mMutexFeatures);mDescriptor = vDescriptors[BestIdx].clone();}
}
Take the descriptor with least median distance to the rest
就是在所有的描述子中找到那個(gè)與其他所有的描述子之間的距離的中值最小的描述子作為該地圖點(diǎn)的描述子,
這里選擇的是中值作為衡量標(biāo)準(zhǔn)。
總結(jié)
以上是生活随笔為你收集整理的ORB-SLAM2中MapPoints的描述子的计算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: map集合遍历的五种方法
- 下一篇: Mybatis为实体类定义别名typeA