LineMod算法:opencv源码笔记(二)(更新中)
梯度方向图的计算及模板的生成
特征点的选择
linemod算法中,一个模板是一个特征点序列(多模态时为多个序列),特征点彼此不能太近且要有足够的代表性。
opencv中的实现是在具体的模态类中计算候选特征点(Candidate,QuantizedPyramid的嵌入类)并将其存入一个候选序列中,特征点的“好坏”也随之计算并存入Candidate的score成员中,然后根据score从高到低对该序列排序。最后利用下面这个静态成员函数:
void QuantizedPyramid::selectScatteredFeatures(const std::vector<Candidate>& candidates,
std::vector<Feature>& features,
size_t num_features, float distance)
实现特征点在空间上的分散性。特征点的选择采用一种启发式的方式:首先取score最高的候选点作为第一个特征点,循环选择与已选特征点满足距离限制并且score最高的点。当选择完毕时特征点的数量小于num_features时,distance会被缩小以放松选择条件保证选取足够的点。
颜色梯度模态
ColorGradientPyramid这个类用来计算颜色梯度方向量化图,生成下一层图片(金字塔),生成当前金字塔层的模板。其通过ColorGradient类来控制,保存生成属性。源码中提供的生成属性如下:
float weak_thr