计算机视觉CV 之 CMT跟踪算法分析3

1 前言

在上一篇blog中,我们分析了CMT的整体算法流程及前面几步的实现分析,接下来我们继续分析后面的几步。

2 Step 4,5,6 特征点匹配与数据融合

这几步就是通过跟踪和特征匹配来获取这一帧的特征点,将两者融合在一起。

上一篇文章分析了光流,这里再分析一下特征匹配。源代码如下:

    //Detect keypoints, compute descriptors 计算当前图像的关键点
    vector<KeyPoint> keypoints;
    detector->detect(im_gray, keypoints);
    // 计算当前图像特征点的描述
    Mat descriptors;
    descriptor->compute(im_gray, keypoints, descriptors);
    //Match keypoints globally 在全局和之前的数据库匹配特征点,计算出匹配的特征点
    vector<Point2f> points_matched_global;
    vector<int> classes_matched_global;
    matcher.matchGlobal(keypoints, descriptors, points_matched_global, classes_matched_global);

主要过程在matchGlobal函数中,分析如下:

void Matcher::matchGlobal(const vector<KeyPoint> & keypoints, const Mat descriptors,
        vector<Point2f> & points_matched, vector<int> & classes_matched)
{

    if (keypoints.size() == 0)
    {
        return;
    }

    vector<vector<DMatch> > matches;
    // 使用knnMatch进行特征匹配,每一个特征描述匹配最佳的2个特征
    bfmatcher->knnMatch(descriptors, database, matches, 2);

    for (size_t i = 0; i < matches.size(); i++)
    {
        vector<DMatch> m = matches[i];
        // 这里的distance是两个特征描述之间的距离不是点与点的距离,距离越大,匹配度越低
        float distance1 = m[0].distance / desc_length;
        float distance2 = m[1].distance / desc_length;
        int matched_class = classes[m[0].trainIdx];

        // 如果匹配的是背景,则跳过
        if (matched_class == -1) continue;
        // 距离要小于一个阈值0.25,表示匹配程度高,大了则跳过
        if (distance1 > thr_dist) continue;
        // 比率也要小于阈值0.8,表示匹配1比匹配2好很多,从而可以将匹配1作为最佳匹配。
        if (distance1/distance2 > thr_ratio) continue;

        points_matched.push_back(keypoints[i].pt);
        classes_matched.push_back(matched_class);
    }

}

上面的距离是Hamming距离:

距离越小,表示匹配程度越高。

接下来是融合跟踪和匹配的点,分析代码如下:

    //Fuse tracked and globally matched points
    //融合跟踪和匹配的点 将两种点都放在一起,并且不重复
    vector<Point2f> points_fused;
    vector<int> classes_fused;
    fusion.preferFirst(points_tracked, classes_tracked, points_matched_global, classes_matched_global,
            points_fused, classes_fused);

核心代码在preferFirst函数中,目的就是不重复添加相同的特征点,很好理解:

void Fusion::preferFirst(const vector<Point2f> & points_first, const vector<int> & classes_first,
    const vector<Point2f> & points_second, const vector<int> & classes_second,
    vector<Point2f> & points_fused, vector<int> & classes_fused)
{

    points_fused = points_first;
    classes_fused = classes_first;

    // 目的是不重复添加相同的特征点
    for (size_t i = 0; i < points_second.size(); i++)
    {
        int class_second = classes_second[i];

        bool found = false;
        for (size_t j = 0; j < points_first.size(); j++)
        {
            int class_first = classes_first[j];
            if (class_first == class_second) found = true;
        }

        if (!found)
        {
            points_fused.push_back(points_second[i]);
            classes_fused.push_back(class_second);
        }

    }

}

3 Step 8,9 估计缩放比率和旋转角度

首先就如何计算的问题,这个其实原理非常简单,就是一开始我们已经存储了初始的特征点,而且是正规化的特征点points_normalized,先计算两两之间的相对距离和相对角度,具体思想见上一篇blog的图,初始的代码如下:

    for (size_t i = 0; i < num_points; i++)
    {
        for (size_t j = 0; j < num_points; j++)
        {
            Point2f v = points_normalized[i] - points_normalized[j];

            float distance = norm(v);
            float angle = atan2(v.y,v.x);

            distances_pairwise.at<float>(i,j) = distance;
            angles_pairwise.at<float>(i,j) = angle;
        }

    }

那么对于新的特征点,同样也是计算他们的相对距离和相对角度,并与初始的数据相除或相减,就得到变化。

最后取他们的中位数作为整体的缩放比率和旋转。

代码如下:

void Consensus::estimateScaleRotation(const vector<Point2f> & points, const vector<int> & classes,
        float & scale, float & rotation)
{

    //Compute pairwise changes in scale/rotation
    // 从缩放和旋转尺度上计算Pairwise改变
    vector<float> changes_scale;
    if (estimate_scale) changes_scale.reserve(points.size()*points.size());
    vector<float> changes_angles;
    if (estimate_rotation) changes_angles.reserve(points.size()*points.size());

    for (size_t i = 0; i < points.size(); i++)
    {
        for (size_t j = 0; j < points.size(); j++)
        {
            if (classes[i] != classes[j])
            {
                // 计算任何两个特征点的相对位置
                Point2f v = points[i] - points[j];

                if (estimate_scale)
                {
                    // 计算距离
                    float distance = norm(v);
                    // 获取特征点的初始距离
                    float distance_original = distances_pairwise.at<float>(classes[i],classes[j]);
                    // 相除得到改变的比率
                    float change_scale = distance / distance_original;
                    changes_scale.push_back(change_scale);
                }

                if (estimate_rotation)
                {
                    // 计算相对角度
                    float angle = atan2(v.y,v.x);
                    // 计算初始角度
                    float angle_original = angles_pairwise.at<float>(classes[i],classes[j]);
                    // 计算角度改变
                    float change_angle = angle - angle_original;

                    //Fix long way angles
                    if (fabs(change_angle) > M_PI) {
                        change_angle = sgn(change_angle) * 2 * M_PI + change_angle;
                    }

                    changes_angles.push_back(change_angle);
                }
            }

        }

    }

    //Do not use changes_scale, changes_angle after this point as their order is changed by median()
    // 计算中位数作为结果
    if (changes_scale.size() < 2) scale = 1;
    else scale = median(changes_scale);

    if (changes_angles.size() < 2) rotation = 0;
    else rotation = median(changes_angles);

}

时间关系,先分析到缩放和旋转这一步,下一篇文章分析CMT最后几步。

本文为原创文章,转载请注明出处:https://blog.csdn.net/songrotek

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-10 14:50:39

计算机视觉CV 之 CMT跟踪算法分析3的相关文章

计算机视觉CV 之 CMT跟踪算法分析二

1 前言 在上一篇文章中,我对CMT算法做了初步的介绍,并且初步分析了一下CppMT的代码,在本篇文章中,我将结合作者的论文更全面细致的分析CMT算法. 这里先说明一下,作者关于CMT算法写了两篇文章: Consensus-based Matching and Tracking of Keypoints for Object Tracking (wacv2014 best paper reward) Clustering of Static-Adaptive Correspondences fo

计算机视觉CV 之 CMT跟踪算法分析四

1 前言 在上一部分我们已经分析到了计算特征点的缩放和旋转,这里最后分析去掉不好的特征点的方法. 2 最后步骤分析 vote的基本思想就是这些特征点相对中心的相对距离在把缩放旋转考虑进去之后是相对不变的,也就是按道理下一帧的特征点相对中心的位置是不变的. 但是由于图像本身的变化,不可能得到完全一样的相对位置,这个时候,有一些会离中心近,有一些会偏差很大.那么,作者就采用聚类的方法,选择最大的一类作为最好的特征点.其他的不要. 上面这个图应该可以很好的理解这个过程.再看作者自己官网上的图大家应该可

自然语言处理(nlp)比计算机视觉(cv)发展缓慢,而且更难!

https://mp.weixin.qq.com/s/kWw0xce4kdCx62AflY6AzQ 1.  抢跑的nlp nlp发展的历史非常早,因为人从计算机发明开始,就有对语言处理的需求.各种字符串算法都贯穿于计算机的发展历史中.伟大的乔姆斯基提出了生成文法,人类拥有的处理语言的最基本框架,自动机(正则表达式),随机上下文无关分析树,字符串匹配算法KMP,动态规划. nlp任务里如文本分类,成熟的非常早,如垃圾邮件分类等,用朴素贝叶斯就能有不错的效果.20年前通过纯统计和规则都可以做机器翻译

【计算机视觉】粒子滤波跟踪

粒子滤波步骤 1.初始化随机选取N个点,权重统一赋值1/N 2.选取目标特征,颜色直方图等等,用于获取先验概率密度,对比相似度 3.确定状态转移矩阵,用于预测下一帧目标位置 循环开始 4.根据状态转移矩阵,对每个粒子,预测目标新位置 5.获得系统观测值,计算观测位置处特征 6.计算每个预测位置处特征,与观测处位置特征对比,相似度高的赋予较大的权重,反之,赋予较小的权重 7.对粒子加权获取当前的目标最佳位置 8.粒子重采样 循环结束 上面是我自己的理解,有些问题仍然不明白: 1.都有观测值了还修正

计算机视觉 之 在iOS上测试跟踪算法Visual Object Tracking Algorithm

前言 在计算机视觉CV领域,视觉跟踪是其中一个重要的子问题.从我的角度看,视觉跟踪就是用在机器人上,用在移动设备上,因此,何不把一些跟踪算法放在iPhone上看看实际的跟踪效果.这才是最真实的对比,使用一些视频毕竟不实际,而且关键是不能很好的对比实时性.对于移动设备而已,实时性是最重要的吧.之所以有跟踪问题的出现,也是因为绝大多数的物体检测Object Detection算法实在是太慢了,根本无法用在视频当中.因此才有了Object Tracking的问题.最终的目标也就是Real Time V

为什么深度学习几乎成了计算机视觉研究的标配?

https://zhuanlan.zhihu.com/p/21533690 标签: 深度学习计算机视觉研究标配 2016-07-09 16:38 1951人阅读 评论(0) 收藏 举报  分类: 计算机视觉CV(308)  目录(?)[+] 本次CVPR 2016上,深度学习几乎成了如今计算机视觉研究的标配,人脸识别.图像识别.视频识别.行人检测.大规模场景识别的相关论文里都用到了深度学习的方法,加上Google,Facebook这样的大企业助力,很多人疑惑,为什么深度学习相比其它的AI实现方法

目标检测与跟踪的研究热点以及发展趋势

目标检测与跟踪的研究热点以及发展趋势: 1) 场景信息与目标状态的融合 场景信息包含了丰富的环境上下文信息, 对场景信息进行分析及充分利用, 能够有效地获取场景的先验知识, 降低复杂的背景环境以及场景中与目标相似的物体的干扰; 同样地, 对目标的准确描述有助于提升检测与跟踪算法的准确性与鲁棒性. 总之,尝试研究结合背景信息和前景目标信息的分析方法,融合场景信息与目标状态, 将有助于提高算法的实用性能. 2) 多维度. 多层级信息融合 为了提高对运动目标表观描述的准确度与可信性, 现有的检测与跟踪

致联系报考我免试研究生的同学们-山世光 研究员-中科院计算所

致联系报考我免试研究生的同学们 山世光 2012年8月23日(修订) 各位同学好: 首先,很高兴与你相识.每年具有免试推荐研究生资格的同学都很多,你联系了我,无论出于何种原因,都说明我们有了一份成为师生缘分的可能.但无奈的是,我通常每年都只能招收2名研究生(或直博生),而联系我的同学每年都超过40人(当然并非这些同学最终都会报我),所以,“选择”就成为我和你不得已的“共同选择”,之所以说“共同选择”,是因为这个过程本身就不是“我选择你”这么简单,而更多的也包括了“你对我的选择”.为了更好地让你了

花十分钟,让你变成AI产品经理

花十分钟,让你变成AI产品经理 https://www.jianshu.com/p/eba6a1ca98a4 先说一下你阅读本文可以得到什么.你能得到AI的理论知识框架:你能学习到如何成为一个AI产品经理并且了解到AI产品经理如何在工作中发挥作用,以及AI产品经理需要从哪些方面锻炼能力.最重要的是,通过本文,一切都特别快(手打滑稽). PS:目前只针对弱人工智能(我喜欢简称,此处我们简称为"弱智")进行学习. 首先我们必须要掌握的是AI的专业知识框架,然后了解AI的市场情况,最后要明白