按照ORBextractor.cc程序中各个函数的出现顺序,依次列出12个函数:
一、IC_Angle函数((对应视觉SLAM十四讲,第7讲7.1.2节))
二、bit_pattern_31_函数—二进制采样点对库
三、ORBextractor 类的构造函数—初始化:金字塔-特征点数量-尺寸因子
四、computeOrientation 函数-计算特征点方向
五、DivideNode 函数-图像区域划分
六、 compareNodes 函数
七、DistributeOctTree函数- 优化特征点分布
八、ComputeKeyPointsOctTree函数- 特征点提取
九、 ComputeKeyPointsOld 函数
十、 ComputeDescriptors 函数
十一、operator() 函数
十二、 ComputePyramid 函数
下面是根据 ORBextractor.cc 的 12 个主要函数作用绘制的流程图结构描述。这个流程图将展示 ORB特征提取 的完整流程,包括金字塔生成、特征点提取、方向计算和描述符生成。
流程图描述:
-
流程起点
输入:原始图像 -
金字塔生成阶段
- 调用 ComputePyramid 函数:
生成图像金字塔,为不同尺度的特征点提取做准备。
- 调用 ComputePyramid 函数:
-
特征点提取阶段
两种方法选择:- ComputeKeyPointsOctTree(默认方法,使用八叉树):
- 调用 DistributeOctTree 函数:
利用八叉树分割图像区域,分布特征点。 - 调用 DivideNode 和 compareNodes 函数:
对图像区域进一步划分和排序,确保特征点均匀分布。
- 调用 DistributeOctTree 函数:
- ComputeKeyPointsOld(备用方法,网格划分):
传统方法提取特征点,不使用八叉树。
- ComputeKeyPointsOctTree(默认方法,使用八叉树):
-
特征点方向计算阶段
-
调用 computeOrientation 函数:
遍历所有提取到的特征点,计算每个特征点的方向角度。 -
调用 IC_Angle 函数:
具体实现方向角度计算,确保旋转不变性。
-
-
描述符计算阶段
- 调用 ComputeDescriptors 函数:
为每个特征点计算 ORB 描述符。- 内部调用 bit_pattern_31 函数:
定义描述符采样点位置,实现二进制描述符生成。
- 内部调用 bit_pattern_31 函数:
- 调用 ComputeDescriptors 函数:
-
特征点与描述符输出阶段
- 调用 operator() 函数:
综合调用上述各个功能函数,执行完整的 ORB 特征提取流程:- 生成金字塔
- 提取特征点(八叉树或传统方法)
- 计算方向
- 计算描述符
- 输出特征点和描述符
- 调用 operator() 函数:
-
流程终点
输出:特征点坐标 + 描述符集合
总结:
- 流程起点:从原始图像输入开始。
- 金字塔生成:通过 ComputePyramid 构建尺度空间。
- 特征点提取:
默认使用 八叉树方法:调用 ComputeKeyPointsOctTree,内部通过 DistributeOctTree、DivideNode 和 compareNodes 实现区域划分和均匀分布。
备用方法是 网格划分法:调用 ComputeKeyPointsOld。 - 方向计算:computeOrientation 负责计算特征点的方向,IC_Angle 提供具体实现。
- 描述符生成:通过 ComputeDescriptors 和 bit_pattern_31 定义采样点并生成二进制描述符。
- 总调度函数:operator() 统一调用上述各个核心函数,完成 ORB 特征提取流程。
- 流程终点:输出特征点坐标及对应的描述符。