matcher.matchLocal(keypoints, descriptors, center, scale, rotation,points_matched_local,
classes_matched_local);
比较当前帧中检测得到的每一个关键点与第一帧中经过旋转和尺度变换之后的所有前景关键点之间的欧氏距离,小于阈值20则该前景关键点是有可能匹配上的,将这些可能的前景关键点构造成一个特征描述库database_potential;
将当前帧中检测得到的每一个关键点的特征描述与database_potential进行knnMatch匹配,每个特征描述子在database_potential寻找最佳的2个匹配结果,排除不稳定的关键点的策略与matchGlobal类似。cmt算法
consensus.initialize(points_normalized);
计算并保存第一帧中所有归一化前景关键点points_normalized与x轴的夹角(反正切)angles_pairwise以及关键点两两之间的距离distances_pairwise。
consensus.estimateScaleRotation(points_fused, classes_fused, scale, rotation);
计算matchGlobal匹配后融合得到的关键点的夹角以及关键点两两之间的距离,并与对应的points_normalized关键点的夹角求差、距离求商,再分别取平均值,评估出当前帧中目标的尺度因子scale和旋转角度rotation。
consensus.findConsensus(points_fused, classes_fused, scale, rotation, center,
points_inlier, classes_inlier);
计算matchGlobal匹配后融合得到的关键点的投票,即每一个关键点与对应的经过尺度和旋转变换后的points_normalized关键点之间构成的向量;
计算两两投票(1中的向量)之间的距离,按距离的大小进行升序排列;
聚类并得到结果中最大的类;(当两个类之间的距离小于阈值,合并这两个类)
将此类中的所有关键点作为points_inlier;
将所有points_inlier关键点的坐标均值作为目标中心点center。
fusion.preferFirst(points_tracked, classes_tracked, points_matched_global, classes_matched_global,
points_fused, classes_fused);
将光流跟踪到的关键点与matchGlobal匹配到的关键点融合,得到的关键点用于评估目标的旋转角度和尺度,以及投票寻找目标中心位置。cmt算法
fusion.preferFirst(points_matched_local, classes_matched_local, points_inlier, classes_inlier,
points_active, classes_active);
将matchLocal匹配到的关键点与inliers关键点融合,得到最终有效的目标关键点points_active,这些关键点用于下一帧的跟踪。
————————————————————————————————
Main函数中的代码与算法本身无关,在此就不总结了,源码中都有详细的注释帮助读者理解。
关于代码的细节和论文的理解,下次再写。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-53282-2.html
是谁在搞