博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenCV meanshift目标跟踪总结
阅读量:4090 次
发布时间:2019-05-25

本文共 1191 字,大约阅读时间需要 3 分钟。

转自:

meanshift算法思想其实很简单:利用概率密度的梯度爬升来寻找局部最优。它要做的就是输入一个在图像的范围,然后一直迭代(朝着重心迭代)直到满足你的要求为止。但是他是怎么用于做图像跟踪的呢?这是我自从学习meanshift以来,一直的困惑。而且网上也没有合理的解释。经过这几天的思考,和对反向投影的理解使得我对它的原理有了大致的认识。

    在opencv中,进行meanshift其实很简单,输入一张图像(imgProb),再输入一个开始迭代的方框(windowIn)和一个迭代条件(criteria),输出的是迭代完成的位置(comp )。
    这是函数原型:
    int cvMeanShift( const void* imgProb, CvRect windowIn,
                      CvTermCriteria criteria, CvConnectedComp* comp )
    但是当它用于跟踪时,这张输入的图像就必须是反向投影图了。
    为什么必须是反向投影图呢?首先我们要理解什么是反向投影图。
    简单理解它其实实际上是一张概率密度图。经过反向投影时的输入是一个目标图像的直方图(也可以认为是目标图像),还一个输入是当前图像就是你要跟踪的全图,输出大小与全图一样大,它上像素点表征着一种概率,就是全图上这个点是目标图像一部分的概率。如果这个点越亮,就说明这个点属于物体的概率越大。现在我们明白了这原来是一张概率图了。当用meanshift跟踪时,输入的原来是这样一幅图像,那也不难怪它可以进行跟踪了。
 
  半自动跟踪思路:输入视频,用画笔圈出要跟踪的目标,然后对物体跟踪。
  用过opencv的都知道,这其实是camshiftdemo的工作过程。
    第一步:选中物体,记录你输入的方框和物体。
    第二步:求出视频中有关物体的反向投影图。
    第三步:根据反向投影图和输入的方框进行meanshift迭代,由于它是向重心移动,即向反向投影图中概率大的地方移动,所以始终会移动到目标上。
    第四步:然后下一帧图像时用上一帧输出的方框来迭代即可。
  全自动跟踪思路:输入视频,对运动物体进行跟踪。
    第一步:运用运动检测算法将运动的物体与背景分割开来。
    第二步:提取运动物体的轮廓,并从原图中获取运动图像的信息。
    第三步:对这个信息进行反向投影,获取反向投影图。
    第四步:根据反向投影图和物体的轮廓(也就是输入的方框)进行meanshift迭代,由于它是向重心移 动,即向反向投影图中概率大的地方移动,所以始终会移动到物体上。
    第五步:然后下一帧图像时用上一帧输出的方框来迭代即可。
 
    总结:用meanshift进行跟踪最重要的一点是输入图像的把握,也就是要让它的迭代能越来越迭代到目标上。这种图像也不一定就是反向投影图,只要是一幅反映当前图像中每个像素点含有目标概率图就可以了,其实反向投影图就是这样的一幅图而已。

转载地址:http://mvnii.baihongyu.com/

你可能感兴趣的文章
(python版)《剑指Offer》JZ30:连续子数组的最大和
查看>>
(python版)《剑指Offer》JZ32:把数组排成最小的数
查看>>
(python版)《剑指Offer》JZ02:替换空格
查看>>
JSP/Servlet——MVC设计模式
查看>>
使用JSTL
查看>>
Java 8新特性:Stream API
查看>>
管理用户状态——Cookie与Session
查看>>
最受欢迎的前端框架Bootstrap 入门
查看>>
JavaScript编程简介:DOM、AJAX与Chrome调试器
查看>>
通过Maven管理项目依赖
查看>>
通过Spring Boot三分钟创建Spring Web项目
查看>>
Spring的IoC(依赖注入)原理
查看>>
Guava快速入门
查看>>
Java编程基础:static的用法
查看>>
Java编程基础:抽象类和接口
查看>>
Java编程基础:异常处理
查看>>
Java编程基础:了解面向对象
查看>>
新一代Java模板引擎Thymeleaf
查看>>
Spring MVC中使用Thymeleaf模板引擎
查看>>
Spring Boot构建简单的微博应用
查看>>