如何使挑選到的特徵點廣泛分佈於影像

Q: 在一張特徵點分佈不平均的圖片中,如何限制所挑選的特徵點能儘量分佈於整個圖片?

A:

  1. 利用廣度優先,將圖片分割成數個等大小區塊。

  2. 如果區塊個數少於要挑選的特徵點個數,則將特徵點個數多於一個的區塊再分割成數個等大小區塊,持續重複此步驟,直到區塊個數多於要挑選的特徵點個數。

  3. 最後每個區塊只取該區塊內強度最強的特徵點作代表,最有的區塊分割可能如下:



程式範例:(截取於 ORB-SLAM2 ORBextractor::DistributeOctTree())

while(lit != lNodes.end())
{
if(lit->bNoMore) // 如果只有一個特徵點,便不再分割
{
// If node only contains one point do not subdivide and continue
lit++;
continue;
}
else // 否則再細分為四個子區塊
{
// If more than one point, subdivide
ExtractorNode n1,n2,n3,n4;
lit->DivideNode(n1, n2, n3, n4);

// Add childs if they contain points
if(n1.vKeys.size() > 0)
{
lNodes.push_front(n1);
if(n1.vKeys.size() > 1)
{
nToExpand++;
vSizeAndPointerToNode.push_back(make_pair(n1.vKeys.size(),&lNodes.front()));
lNodes.front().lit = lNodes.begin();
}
}

if(n2.vKeys.size() > 0)
{
lNodes.push_front(n2);
if(n2.vKeys.size() > 1)
{
nToExpand++;
vSizeAndPointerToNode.push_back(make_pair(n2.vKeys.size(),&lNodes.front()));
lNodes.front().lit = lNodes.begin();
}
}

if(n3.vKeys.size() > 0)
{
lNodes.push_front(n3);
if(n3.vKeys.size() > 1)
{
nToExpand++;
vSizeAndPointerToNode.push_back(make_pair(n3.vKeys.size(),&lNodes.front()));
lNodes.front().lit = lNodes.begin();
}
}

if(n4.vKeys.size() > 0)
{
lNodes.push_front(n4);
if(n4.vKeys.size() > 1)
{
nToExpand++;
vSizeAndPointerToNode.push_back(make_pair(n4.vKeys.size(),&lNodes.front()));
lNodes.front().lit = lNodes.begin();
}
}

lit = lNodes.erase(lit);
continue;
}
}




Reference




文字內容 或 影像內容 部份參考、引用自網路,如有侵權,請告知,謝謝。
創作者介紹

拾人牙慧點滴

silverwind1982 發表在 痞客邦 PIXNET 留言(0) 人氣()