代码主要在CMT这个类里面,主要包含initialize和processFrame两个函数实现,跟论文契合的非常好,每一个成员时干啥的,我都注释在旁边了
代码下载链接点击打开链接
namespace cmt
{
class CMT
{
public:
CMT() : str_detector("FAST"), str_descriptor("BRISK") {} //默认的特征检测和描述子
void initialize(const Mat im_gray, const Rect rect); //rect是初始目标框
void processFrame(const Mat im_gray);
Fusion fusion;//跟踪点融合:融合跟踪和匹配的点 将两种点都放在一起,并且不重复
Matcher matcher; //DescriptorMatcher 用的knnMatch匹配
Tracker tracker; //光溜匹配跟踪 上一帧的特征点使用光流法跟踪得到这一帧的特征点的位置T
Consensus consensus;//包括scale和rotation angel的求取和对目标中心的投票
string str_detector;
string str_descriptor;
vector<Point2f> points_active; //public for visualization purposes
RotatedRect bb_rot;
private:
Ptr<FeatureDetector> detector;
Ptr<DescriptorExtractor> descriptor;
Size2f size_initial;
vector<int> classes_active; //forgroud points -in target boundingbox's
float theta;
Mat im_prev;
};
} /* namespace CMT */
最重要的跟踪实现流程:
初始化的代码实现,加注释:
void CMT::initialize(const Mat im_gray, const Rect rect)
{
//Remember initial size
size_initial = rect.size();
//Remember initial image
im_prev = im_gray;
//Compute center of rect
Point2f center = Point2f(rect.x + rect.w