1 前言
在上一篇文章中,我对CMT算法做了初步的介绍,并且初步分析了一下CppMT的代码,在本篇文章中,我将结合作者的论文更全面细致的分析CMT算法。
这里先说明一下,作者关于CMT算法写了两篇文章:
Consensus-based Matching and Tracking of Keypoints for Object Tracking (wacv2014 best paper reward)
Clustering of Static-Adaptive Correspondences for Deformable Object Tracking (cvpr 2015)
其中wacv的文章从更工程的角度来分析CMT的算法,写出来其详细的流程,比较推荐阅读。
2 CMT 算法流程
这里我直接截取了文章中的原图。
我把它翻译一下:
算法 CMT
输入: 视频帧,初始的物体框
输出:每一帧视频的物体框
要求:后继的物体框能够保持框住初始框框住的物体
步骤:
Step 1:检测初始视频帧的所有特征点和特征描述,不仅仅是框内的点而是整个图像的点,所以在代码中可以看到,初始的database数据库的特征描述包含了前景(框内)和背景(框外)的特征
Step 2:将初始框内的特征描述赋给K1
Step 3:从第二帧开始
Step 4:检测视频帧的特征点P
Step 5:将特征点P与O匹配,获取匹配的特征点M
Step 6:利用上一帧的特征点使用光流法跟踪得到这一帧的特征点的位置T
Step 7:融合特征点M和特征点T得到这一帧的总的特征点K’
Step 8:根据K’估计特征点相对初始帧特征的缩放比例
Step 9:根据K’估计特征点相对初始帧特征的旋转比例
Step 10:根据Step7,8,9得到的数据计算每一个特征点的Vote
Step 11:采用聚类的方法选取最大的类也就是最一致的VoteC
Step 12:将VoteC转换回特征点得到最后这一帧的有效特征点
Step 13:判断VoteC的长度是否大于最小阈值,如果是则计算最后新的旋转矩形框的参数,如果不是也就是框太小了则输出0
下面结合代码及论文分析每一步
Step 1,2 初始化
在CMT.cpp的代码中可以比较清晰的理解,就是使用openCV的Fast或者BRISK特征检测及特征描述。然后关键是存储有效的数据在数据库用于之后的匹配,主要在以下两个代码
//Initialize matcher 初始化匹配器
matcher.initialize(points_normalized, descs_fg, classes_fg, descs_bg, center);
//Initialize consensus 初始化一致器
consensus.initialize(points_normalized);