orb提取特征点 四叉树均匀化
时间: 2023-07-28 21:19:09 浏览: 40
ORB算法中的四叉树均匀化是为了保证提取到的特征点在图像中均匀分布,避免在某些区域密集提取特征点,而在其他区域没有特征点的情况。下面是ORBSLAM2中的四叉树均匀化的代码实现,供您参考:
```c++
void ORBextractor::DistributeOctTree(vector<cv::KeyPoint>& vKeys, const int &minX, const int &maxX,
const int &minY, const int &maxY, const int &nFeatures, const int &level)
{
if(level==0)
{
for(int i=minX; i<maxX; i+=mnMinX)
for(int j=minY; j<maxY; j+=mnMinY)
{
cv::KeyPoint kp;
kp.pt = cv::Point2f(float(i)+float(mnMinX)/2.0f, float(j)+float(mnMinY)/2.0f);
kp.octave = level;
vKeys.push_back(kp);
}
return;
}
const int nIni = vKeys.size();
for(int i=minX+mnMinX; i<maxX-mnMinX; i+=mnMinX)
for(int j=minY+mnMinY; j<maxY-mnMinY; j+=mnMinY)
{
if(countNonZero(umax(ucvMask(cv::Range(j-mnMinY,j+mnMinY),cv::Range(i-mnMinX,i+mnMinX)),255))>0)
continue;
DistributeOctTree(vKeys,i-mnMinX,i+mnMinX,j-mnMinY,j+mnMinY,nFeatures,level-1);
}
if(level == mnMaxLevel && vKeys.size()-nIni<nFeatures)
{
int dx = maxX - minX;
int dy = maxY - minY;
while(vKeys.size()-nIni<nFeatures)
{
for(int i=minX+dx/10; i<maxX; i+=dx/10)
for(int j=minY+dy/10; j<maxY; j+=dy/10)
{
cv::KeyPoint kp;
kp.pt = cv::Point2f(float(i)+float(dx)/20.0f, float(j)+float(dy)/20.0f);
kp.octave = level-1;
vKeys.push_back(kp);
if(vKeys.size()-nIni>=nFeatures)
return;
}
dx+=mnMinX;
dy+=mnMinY;
}
}
}
```
该函数接受一些参数,包括要提取的特征点范围(minX, maxX, minY, maxY),要提取的特征点数目(nFeatures),以及当前的金字塔层数(level)。函数首先检查当前是否是最底层(即level==0),如果是,则将特征点均匀分布到该层所有的网格中,每个网格的中心点就是一个特征点。如果不是最底层,则递归地调用该函数,将特征点均匀分布到子网格中。在递归过程中,如果某个子网格中已经有特征点,则不再向其中添加新的特征点。
当递归回到最顶层(即level==mnMaxLevel)时,如果提取的特征点数目仍然不足,就在每个网格的中心点附近添加新的特征点,直到达到所需的特征点数目为止。