日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。