一、主函数ORBextractor::operator()
被调用的函数都会在后面详细讲到,这个部分是梳理主线,让读者了解每个函数在哪里被使用到,有什么作用,以便更好的有体系的学习,
主函数直接或间接的调用了除构造函数外的所有函数,构造函数会在主线程(Tracking)中被初始化。
其中FAST()函数和GaussianBlur()是OpenCV的内置函数。
1. 判断传进来的图像是否为空,不为空则将其转化为灰度图像
2. 调用函数ORBextractor::ComputePyramid()
该函数的作用是构建函数金字塔,并扩充函数边界
3. 调用函数ComputeKeyPointsOctTree()
该函数是用四叉树的方法来计算特征点
1. 将图像金字塔的某一个图层分为30*30的网格
a. 用图像的长和高除网格的边长得到网格的行数和列数
b. 最后一行不足30时,全部分给最后一行(不是恰好够分的话,牺牲最后一行)
2. 调用FAST角点提取函数,在每个网格内提取角点并放入存放角点的容器内
a. 如果该容器为空(没有提取到角点),则减小阈值继续提取
b. 如果容器不为空,则遍历所有FAST角点,将其坐标转换到『坐标边界』下的坐标
3. 调用 DistributeOctTree()函数用来分配特征点
这个函数调用了DivideNode()函数
5. 将所有的特征点坐标恢复到『边缘扩充图像』坐标系下的坐标
6. 调用computeOrientation()计算每个特征点的方向信息
这个函数调用了IC_Angle()函数,IC_Angle()函数是计算一个特征点的方向信息的函数,此函数用循环的方法调用IC_Angle(),
来求所有特征点的方向信息
4.统计金字塔所有层中特征点的总数,若无则释放描述子
5.遍历所有金字塔图层,先对图层进行高斯模糊,然后计算描述子
1. 调用GaussianBlur()函数进行高斯模糊
2. 调用computeDescriptors()函数来计算描述子
这个函数调用了computeDescriptor()函数,computeDescriptor()函数是计算一个特征点的描述子函数,
此函数用循环的方法调用computeDescriptor(),来求所有特征点的描述子
6.将所有处理好的特征点放入容器内,自此特征提取结束
二、总结
特征提取的步骤及其顺序
图像金字塔分层
计算每层金字塔的特征点数量
每个图层分成30*30的网格
在每个网格里面提取特征点
用四叉树的方法分配特征点
每个节点中取应答最大的那个特征点
计算所有特征点的方向信息和描述子
将所有处理好的特征点放入容器中